質問編集履歴

4

訂正

2023/11/16 12:45

投稿

hupyaginu
hupyaginu

スコア15

test CHANGED
File without changes
test CHANGED
@@ -15,7 +15,8 @@
15
15
  以下のような結果を期待しています。
16
16
  ~~どのようなSQLを書けば実現できますか?~~
17
17
  ※追記:実現はできました。
18
- しかし、一時テーブルを作成してから集計する事はパフォーマンスがよくなさそうです。
18
+ しかし、一時テーブルを作成する部分のSQLがパフォーマンスがよくなさそうです。
19
+ 最初にproduct_id, dateをあらかじめ用意せずにできそうな気もしていますがやりかたが分かりません。
19
20
  もっとよいSQLはありますでしょうか?
20
21
 
21
22
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-11-16/4d6e10a1-77ab-47a3-a4e9-9544bc705c04.png)

3

タグ追加

2023/11/16 12:40

投稿

hupyaginu
hupyaginu

スコア15

test CHANGED
File without changes
test CHANGED
File without changes

2

修正

2023/11/16 12:38

投稿

hupyaginu
hupyaginu

スコア15

test CHANGED
File without changes
test CHANGED
@@ -13,12 +13,49 @@
13
13
 
14
14
  # 質問
15
15
  以下のような結果を期待しています。
16
- どのようなSQLを書けば実現できますか?
16
+ ~~どのようなSQLを書けば実現できますか?~~
17
+ ※追記:実現はできました。
18
+ しかし、一時テーブルを作成してから集計する事はパフォーマンスがよくなさそうです。
19
+ もっとよいSQLはありますでしょうか?
20
+
17
21
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-11-16/4d6e10a1-77ab-47a3-a4e9-9544bc705c04.png)
18
22
 
23
+
19
24
  ### 試したこと
25
+ 追記:以下のように一時テーブルを作成してから集計すると期待する結果が得られました。
26
+ ```SQL
27
+ create temporary table `tmp_dates`
28
+ select
29
+ tmp.`product_id`,
30
+ tmp.`date`
31
+ from (
32
+ select `product_id`, `date` from sell_logs
33
+ union all
34
+ select `product_id`, `date` from return_logs
35
+ ) tmp
36
+ ;
37
+
38
+ select
39
+ p.id,
40
+ p.`name`,
41
+ td.`date`,
42
+ sl.`num`,
43
+ rl.`num`
44
+ from `tmp_dates` td
45
+ left outer join sell_logs sl on sl.`product_id` = td.`product_id` and sl.`date` = td.`date`
46
+ left outer join return_logs rl on rl.`product_id` = td.`product_id` and rl.`date` = td.`date`
47
+ inner join products p on p.id = td.product_id
48
+
49
+ group by
50
+ p.`id`,
51
+ td.`date`;
52
+ ```
53
+
54
+
20
- `return_logs`にだけ`2023-01-04`が存在するので、`2023-01-04`が取得できるように日付専用で一時テーブルを作成してからJOINして集計を試みました。
55
+ ~~`return_logs`にだけ`2023-01-04`が存在するので、`2023-01-04`が取得できるように日付専用で一時テーブルを作成してからJOINして集計を試みました。
21
- しかし期待する結果が得られませんでした。
56
+ しかし期待する結果が得られませんでした。~~
57
+
58
+ <s>
22
59
 
23
60
  ```SQL
24
61
  /* 一時テーブルを作成して集計する */
@@ -47,6 +84,7 @@
47
84
  p.`id`,
48
85
  td.`date`;
49
86
  ```
87
+ </s>
50
88
 
51
89
  ### ソースコード
52
90
  https://dbfiddle.uk/tRKBk26A

1

修正

2023/11/16 12:24

投稿

hupyaginu
hupyaginu

スコア15

test CHANGED
File without changes
test CHANGED
@@ -21,6 +21,7 @@
21
21
  しかし期待する結果が得られませんでした。
22
22
 
23
23
  ```SQL
24
+ /* 一時テーブルを作成して集計する */
24
25
  create temporary table `tmp_dates`
25
26
  select
26
27
  tmp.`date`
@@ -30,6 +31,21 @@
30
31
  select `date` from return_logs
31
32
  ) tmp
32
33
  ;
34
+
35
+ select
36
+ p.id,
37
+ p.`name`,
38
+ td.`date`,
39
+ sl.`num`,
40
+ rl.`num`
41
+ from `tmp_dates` td
42
+ left outer join sell_logs sl on sl.`date` = td.`date`
43
+ left outer join return_logs rl on rl.`date` = td.`date`
44
+ inner join products p on p.id = sl.product_id
45
+
46
+ group by
47
+ p.`id`,
48
+ td.`date`;
33
49
  ```
34
50
 
35
51
  ### ソースコード