前提・実現したいこと
・SQL server2019
SQLにて2つのテーブルからデータ抽出を行おうとしています。
最終的に出したい結果としては以下の表のように購入数/配信数(=メール配信して購入してくれた人の数)を調査したいです。
|メール名|配信月|配信数|購入数|
|:--|:--:|--:|
|MailA|2021-01|2|1|
|MailB|2021-01|2|1|
抽出条件
①配信日より購入日の値が大きいこと(=メール配信後に購入していること)
②既に購入していたのにも関わらず配信してしまっていた人は配信数、購入数ともに集計から除外すること
→下記の使用テーブルであればItoさんとKawadaさんは②に該当する為、集計対象から除外したい
※メール名ごとの配信先氏名と購入者名をカウントしてそれぞれ配信数、購入数を集計する
使用テーブル
配信データテーブル
メール名 | 配信先氏名 | 配信日 |
---|---|---|
MailA | Sato | 2021-01-01 |
MailB | Yamada | 2021-01-12 |
MailB | Ito | 2021-01-06 |
MailA | kawada | 2021-01-11 |
MailA | Obama | 2021-01-02 |
購入履歴データテーブル
購入者名 | 購入日 |
---|---|
Sato | 2021-01-02 |
Yamada | 2021-01-14 |
Ito | 2021-01-02 |
kawada | 2021-01-09 |
発生している問題
既に購入していたのにも関わらず配信してしまっていた人を配信数、購入数から除外する処理が上手く実装できず、困っています。 下記SQLではメール配信したけれど購入しなかった人まで除外されてしまっているようで、機体動作ではありません。(購入履歴データテーブルをleft outer joinしており、購入しなかった人の購入日カラムにはNullが入る為?) どうにか購入しなかった人も配信数には含めつつ、既に購入していたのにも関わらず配信してしまっていた人は配信数と購入数から除外したいのですが良い方法が思い浮かばずの状態です。
試したSQL
SQL
1select 2 snt.メール名, 3 convert(varchar,substring(snt.配信日,1,6),112) as 配信月, 4 count(snt.配信先氏名) as 配信数, 5 count(cvt.購入者名) as 購入数 6 7from 8 配信データテーブル as snt 9left outer join 10 購入履歴データテーブル as cvt 11on 12 snt.配信先氏名 = cvt.購入者名 13and 14--抽出条件① 15 snt.配信日 <= cvt.購入日 16 17where 18--抽出条件② 19 not (cvt.購入日 < snt.配信日) 20 21group by 22 メール名, 23 convert(varchar,substring(snt.配信日,1,6),112)
補足
SQL初心者でして、説明下手で申し訳ございません。。
色々なサイトを見漁って調べたのですがなかなか良い解決策が浮かばず、
何か良い方法がございましたらご教示いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/27 12:13