MyController

WEB業界素人の僕がまた見返しそうなことのメモです。

【SQL】集計時に役立つSELECT文の入れ子構造(ネスト)

下記テーブル4つがある。
・(account_master)会員マスタ ※アカウントIDが1つ
・(person_info)会員の詳細マスタ ※アカウントIDが1つ
・(recommend_target)キャンペーンのテーブル ※アカウントID複数あり
・(shipment_info)出荷データ ※アカウントIDが複数あり


これを結合させて、キャンペーン対象のアカウントが実際に出荷していて、なおかつその出荷日が4月中だった場合の
アカウント情報、出荷した数を出したい。

普通にSELECTでWhereとするとぱっと見は出来ているが、幾つかのアカウントで数が合わなかった。

おそらくはキャンペーンのテーブルにアカウントIDが幾つかある場合、その数だけずれているみたい。
つまりキャンペーンのテーブルで一旦アカウントIDを整理して重複しないようにする必要がある。

最終的なSQL文は下記。


select si.bill_accnt_no,count(si.shp_dt),am.company_name,pi.unit,am.zip_code,am.prefecture,am.address,pi.tel,pi.name,pi.mail
from ((`shipment_info` si,
(select acount_id from `recommend_target` rt
where
rt.reco_start_date = '2017-04-01 00:00:00' and rt.reco_end_date = '2017-05-01 00:00:00'
group by rt.acount_id
)A)
inner join `account_master` am on am.account_id = si.bill_accnt_no)
inner join `person_info` pi on am.account_id = pi.account_id
where
si.shp_dt >= '2017-04-01' and si.shp_dt <= '2017-04-30'
and
si.bill_accnt_no = A.acount_id
and
am.delete_date is null
and pi.main_user = 1
group by si.bill_accnt_no



ネストした時のAというのはKEYになるらしく、適当なものでいいみたい。


分からないときは一度図に書いてみてどこから絞り込むと分かりやすいかが分かると思うのでおすすめ。