回答編集履歴

1

追記

2017/05/24 06:57

投稿

yambejp
yambejp

スコア114839

test CHANGED
@@ -3,3 +3,81 @@
3
3
  集計したテーブルをサブクエリにして
4
4
 
5
5
  カレンダーテーブルにleft joinしてあげてください
6
+
7
+
8
+
9
+ # 追記
10
+
11
+ ちょっとわかりにくいかもしれないのでプロシージャの書き方を追記しておきます。
12
+
13
+ - 元データ
14
+
15
+ ```SQL
16
+
17
+ create table sales(date date,price int);
18
+
19
+ insert into sales values
20
+
21
+ ('2017-05-01',12000),
22
+
23
+ ('2017-05-02',12000),
24
+
25
+ ('2017-05-02',8000),
26
+
27
+ ('2017-05-02',8000),
28
+
29
+ ('2017-05-05',15000),
30
+
31
+ ('2017-05-05',6000);
32
+
33
+ ```
34
+
35
+ - プロシージャを作ります。
36
+
37
+ ```SQL
38
+
39
+ drop procedure if exists temp_cal;
40
+
41
+ delimiter //
42
+
43
+ create procedure temp_cal(in min date ,in max date)
44
+
45
+ begin
46
+
47
+ create temporary table temp(date date);
48
+
49
+ set @d=min;
50
+
51
+ while @d<=max do
52
+
53
+ insert into temp values(@d);
54
+
55
+ set @d:=@d + interval 1 day;
56
+
57
+ end while;
58
+
59
+ end
60
+
61
+ //
62
+
63
+ delimiter ;
64
+
65
+
66
+
67
+ ```
68
+
69
+ - プロシージャをcallしつつ、カレンダーに連結します
70
+
71
+ ```SQL
72
+
73
+ call temp_cal('2017-05-01','2017-05-05');
74
+
75
+ select t1.date,coalesce(sum_price,0) as sum_price from temp as t1
76
+
77
+ left join (select date,sum(price) as sum_price from sales group by date) as t2
78
+
79
+ on t1.date=t2.date
80
+
81
+ order by date;
82
+
83
+ ```