前提条件
メンバーテーブル member m
id | mail_addres | name |
---|---|---|
1 | test@hoge.jp | testA |
2 | test2@hoge.jp | testB |
3 | test3@hoge.jp | testC |
契約商品テーブル member_item mi
id | member_id | start_date | end_date |
---|---|---|---|
1 | 1 | 2020/01/01 | 2020/03/30 |
2 | 2 | 2020/01/01 | 2020/04/30 |
3 | 2 | 2020/05/01 | null |
4 | 3 | 2020/05/01 | 2020/06/30 |
5 | 3 | 2020/07/01 | 2020/08/31 |
以下のクエリを実行すると、
SELECT m.id, m.name, mi.start_date, mi.end_date FROM member m INNER JOIN member_item mi ON m.id = mi.member_id
クエリ実行後
id | name | start_date | end_date |
---|---|---|---|
1 | testA | 2020/01/01 | 2020/03/30 |
2 | testB | 2020/01/01 | 2020/04/30 |
2 | testB | 2020/05/01 | null |
3 | testC | 2020/05/01 | 2020/06/30 |
3 | testC | 2020/07/01 | 2020/08/31 |
上記の表で抽出されます。
今回したいこと→退会者のみ抽出したい
退会者を判断する材料としては、
定額制の商品には適用開始期間(start_date)と適用終了期間(end_date)があり、
end_dateに値が入っていると退会者とします。
表で言うとtestAは退会者に該当します。
しかし、定額制の商品は別の商品で再契約ができてしまいます。
testBのように別商品で5月(start_date)と再度契約することができます。
この場合、testBは再契約しているので、退会者には該当しません。
※中には再契約後に退会する人もいます。(該当者testC)
試したこと
SELECT m.id, m.name, mi.start_date, mi.end_date FROM member m INNER JOIN member_item mi ON m.id = mi.member_id WHERE mi.end_date IS NOT NULL //追加
ひとまずend_dateが無い場合は表に出さないようにした。
すると、以下のように抽出されます。
id | name | start_date | end_date |
---|---|---|---|
1 | testA | 2020/01/01 | 2020/03/30 |
2 | testB | 2020/01/01 | 2020/04/30 |
3 | testC | 2020/05/01 | 2020/06/30 |
3 | testC | 2020/07/01 | 2020/08/31 |
今回知りたいこと
・この場合における、testBを抽出条件に出さない方法
・testCは最新の退会日付が入っているレコードのみを抽出したい
何か方法面などご教示頂けますと幸いです。
出したいクエリ
id | name | start_date | end_date |
---|---|---|---|
1 | testA | 2020/01/01 | 2020/03/30 |
3 | testC | 2020/07/01 | 2020/08/31 |
回答2件
あなたの回答
tips
プレビュー