会社が利用する、顧客管理の仕組みを作っています。
見積書と請求書作成の機能も付いています。
見積書と請求書を顧客情報を結合して、1レコード毎に纏めて情報を出したいと思っています。
- 見積書・請求書に顧客が紐づいていなくても出力したいです
- 見積書・請求書、どちらか一方のデータがあれば出力したいです
各テーブルの関係
- 見積書と請求書は紐づいているもの、紐づいていないものがあります
- 見積書と請求書は、顧客データと紐づいているもの、紐づいていないものがあります
- 見積書と請求書すべてに、システムを利用している会社(host)のIDが振られています
- 見積書の請求書IDには、値が入っていません
テーブル構成は下記です。
- estimate : 見積書テーブル
- invoice : 請求書テーブル
- host : システム利用会社テーブル
- customer : 顧客テーブル
unionを使って、理想に近い形でデータが取得できましたが、
見積IDの重複が少し出てしまい、上手く行きません。
group byすると、nullもgroup byされるので、レコード数が期待よりだいぶ少なくなります。
SQL
1 2select * 3from 4 ( 5 select estimate.estimate_id, 6 estimate.invoice_id, 7 customer.customer_id 8 from estimate 9 left outer join 10 customer on estimate.customer_id = customer.customer_id 11 where 12 estimate.host_id = 1203507743 13 and 14 estimate.deleted_at is null 15 union 16 select invoice.estimate_id, 17 invoice.invoice_id, 18 customer.customer_id 19 from invoice 20 left outer join 21 customer on invoice.customer_id = customer.customer_id 22 where 23 invoice.host_id = 1203507743 24 and 25 invoice.deleted_at is null 26 ) as q1; 27
上記実行結果で見積もりIDの重複が無くなれば期待通りになります。
文字数制限のためテーブル生成のSQLとInsert文はgistにあげました。
すみませんが、どなたか分かる方いたら、教えていただけないでしょうか…。
=== gentaroさん指摘=============================================
「1レコード毎に纏めて」の意味を定義してください。
見積書・請求書を印刷できるWebページを作っています。
見積書・請求書はどちらかが削除されてても1行に全て出力します。
と。書いていて普通にJOINして、削除フラグをプログラムから見て
ボタンを出力する・しないすればいいだけだということに気が付きました。
SQL
1 2select estimate.estimate_id, 3 invoice.invoice_id, 4 estimate.deleted_at as a, 5 invoice.deleted_at as b 6from estimate 7left join invoice on estimate.estimate_id = invoice.estimate_id 8where estimate.host_id = 1203507743; 9
===============================================================
=== Orlofskyさん指摘=============================================
リンク先のINSERT文も各テーブル5件程度に削っては?そうすればここの質問にまとめられるのでは?
重複出る理由が分からず、何削っていいか分からないので、
今回はギブします。ごめんなさい。
少なくした結果を、codeで出すと分かりやすいですよというアドバイスだと思ってます。
どうもありがとうござました。
===============================================================
回答1件
あなたの回答
tips
プレビュー