回答編集履歴
1
tuiki
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
|
+
```
|