回答編集履歴

1

tuiki

2022/11/21 08:47

投稿

yambejp
yambejp

スコア114896

test CHANGED
@@ -1 +1,53 @@
1
1
  プロシージャでSQL文を生成するのが妥当ですね
2
+
3
+ # 参考
4
+ mysqlを利用したprocedure
5
+ ```SQL
6
+ /* 元テーブル */
7
+ create table tbl
8
+ (user_id int,traffic_souce varchar(10),created_at datetime);
9
+ insert into tbl values
10
+ (123456789,'AAA','2022-04-11 0:00'),
11
+ (789456123,'BBB','2022-04-12 0:00'),
12
+ (563247859,'CCC','2022-04-13 0:00'),
13
+ (123456789,'DDD','2022-04-14 0:00'),
14
+ (789456123,'EEE','2022-04-15 0:00'),
15
+ (563247859,'AAA','2022-04-15 0:00');
16
+
17
+ /* プロシージャ作成 */
18
+ drop procedure if exists proc;
19
+ delimiter //
20
+ create procedure proc ()
21
+ begin
22
+ declare a varchar(10);
23
+ declare done int default 0;
24
+ declare cur cursor for
25
+ select distinct traffic_souce from tbl;
26
+ declare continue handler for sqlstate '02000' set done = 1;
27
+ set @sql='';
28
+ open cur;
29
+ repeat
30
+ fetch cur into a;
31
+ if not done then
32
+ if @sql='' then
33
+ set @sql='select user_id,';
34
+ else
35
+ set @sql=concat(@sql,',');
36
+ end if;
37
+ set @sql=concat(@sql,'sum(traffic_souce=\'',a,'\') as `',a,'` ');
38
+ end if;
39
+ until done end repeat;
40
+ close cur;
41
+
42
+ set @sql=concat(@sql,'from tbl ');
43
+ set @sql=concat(@sql,'group by user_id ');
44
+ prepare stmt from @sql;
45
+ execute stmt;
46
+ end
47
+ //
48
+ delimiter ;
49
+ ```
50
+ 実行
51
+ ```SQL
52
+ call proc();
53
+ ```