前提・実現したいこと
お店テーブル、予約テーブル、注文テーブルの3つのテーブルがあります。
以下の3つのテーブルに対して、半月ごとのそれぞれのお店のamountを集計したいです。
お店テーブル
id(bigint(20)) | shop_name(varchar(50)) |
---|---|
1 | お店A |
2 | お店B |
3 | お店C |
予約テーブル
id(bigint(20)) | created_at(datetime) |
---|---|
1 | 2020-10-05 11:25:25 |
2 | 2020-10-20 11:25:25 |
3 | 2020-11-05 11:25:25 |
4 | 2020-11-20 11:25:25 |
注文テーブル
id(bigint(20)) | amount(decimal(10,0)) | 予約id(bigint(20)) | お店id(bigint(20)) |
---|---|---|---|
1 | 100 | 1 | 1 |
2 | 250 | 2 | 2 |
3 | 350 | 3 | 3 |
4 | 500 | 4 | 1 |
例えば2020年10月1日から2020年11月30日までの期間で集計する場合、期待する出力結果としては以下を期待してます。
|dt_from|dt_to|shop_name|total_amount|
|:--|:--|:--|
|2020-10-01|2020-10-15|お店A|100|
|2020-10-01|2020-10-15|お店B|0|
|2020-10-01|2020-10-15|お店C|0|
|2020-10-16|2020-10-31|お店A|0|
|2020-10-16|2020-10-31|お店B|250|
|2020-10-16|2020-10-31|お店C|0|
|2020-11-01|2020-11-15|お店A|0|
|2020-11-01|2020-11-15|お店B|0|
|2020-11-01|2020-11-15|お店C|350|
|2020-11-16|2020-11-30|お店A|500|
|2020-11-16|2020-11-30|お店B|0|
|2020-11-16|2020-11-30|お店C|0|
クエリ
sql
1SELECT 2c.dt_from, 3c.dt_to, 4s.shop_name, 5IFNULL(sum(o.amount), 0) AS total_amount 6FROM 7(SELECT 8 @f:='2020-10-01' AS dt_from, 9 DATE_ADD(@f, INTERVAL 14 DAY) AS dt_to 10 UNION ALL 11 SELECT 12 @f:=DATE_ADD(@f, INTERVAL 15 DAY) AS dt_from, 13 DATE_ADD(@f, INTERVAL 14 DAY) AS dt_to 14 FROM 15 reservations 16 WHERE 17 @f < '2020-11-15' 18) AS c -- cはcalendarのc 19LEFT OUTER JOIN reservations r 20ON c.dt_from <= DATE(r.created_at) AND DATE(r.created_at) <= c.dt_to 21LEFT JOIN orders o 22ON o.reservation_id = r.id 23INNER JOIN shops s 24ON r.shop_id = s.id 25GROUP BY c.dt_from, c.dt_to, s.shop_name 26ORDER BY c.dt_from 27
クエリ実行結果
|dt_from|dt_to|shop_name|total_amount|
|:--|:--|:--|
|2020-10-01|2020-10-15|お店A|100|
|2020-10-16|2020-10-31|お店B|250|
|2020-11-01|2020-11-15|お店C|350|
|2020-11-16|2020-11-30|お店A|500|
注文があったときだけしか返ってきません。
ご回答よろしくお願いします。
補足情報
MySQL 5.7.12