実現したいこと
SQLでデータを集計したいです。
発生している問題
はじめに、以下のように商品、日付 別に販売数(sell_num)を集計する事はできました。
つぎに、sell_num
の右側に返品数(return_num)も追加しよう考えました。
しかし、return_num
は全てnullになってしまいます。
質問
以下のような結果を期待しています。
どのようなSQLを書けば実現できますか?
※追記:実現はできました。
しかし、一時テーブルを作成する部分のSQLがパフォーマンスがよくなさそうです。
最初にproduct_id, dateをあらかじめ用意せずにできそうな気もしていますがやりかたが分かりません。
もっとよいSQLはありますでしょうか?
試したこと
追記:以下のように一時テーブルを作成してから集計すると期待する結果が得られました。
SQL
1create temporary table `tmp_dates` 2 select 3 tmp.`product_id`, 4 tmp.`date` 5 from ( 6 select `product_id`, `date` from sell_logs 7 union all 8 select `product_id`, `date` from return_logs 9 ) tmp 10; 11 12select 13 p.id, 14 p.`name`, 15 td.`date`, 16 sl.`num`, 17 rl.`num` 18from `tmp_dates` td 19left outer join sell_logs sl on sl.`product_id` = td.`product_id` and sl.`date` = td.`date` 20left outer join return_logs rl on rl.`product_id` = td.`product_id` and rl.`date` = td.`date` 21inner join products p on p.id = td.product_id 22 23group by 24 p.`id`, 25 td.`date`;
return_logs
にだけ2023-01-04
が存在するので、2023-01-04
が取得できるように日付専用で一時テーブルを作成してからJOINして集計を試みました。
しかし期待する結果が得られませんでした。
</s>SQL
1/* 一時テーブルを作成して集計する */ 2create temporary table `tmp_dates` 3 select 4 tmp.`date` 5 from ( 6 select `date` from sell_logs 7 union all 8 select `date` from return_logs 9 ) tmp 10; 11 12select 13 p.id, 14 p.`name`, 15 td.`date`, 16 sl.`num`, 17 rl.`num` 18from `tmp_dates` td 19left outer join sell_logs sl on sl.`date` = td.`date` 20left outer join return_logs rl on rl.`date` = td.`date` 21inner join products p on p.id = sl.product_id 22 23group by 24 p.`id`, 25 td.`date`;
ソースコード
補足情報
- MariaDB 10.9.2
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。