我有简单的数据表,其中事件时间与id相关联。每个id可以有0,1个或更多事件时间。
所以我的数据看起来像这样
ID EventTime
----------
1 15
3 49
3 78
5 68
6 62
7 85
7 86
我想转向我的数据方面,并有以下
ID Event1 Event2 Event3 Event4 etc
----------------------------------------
1 15
3 49 78
5 68
6 62
7 85 86
我看过交叉表,但我认为它与固定列表有关,而我的不同取决于有多少,如果有任何观察。
可能是Mysql56,我使用Heidi前端。
所以看看回复(谢谢)我想我需要使用PIVOT。
非常感谢语法中的任何帮助。在那里大约有80万个eventIds,每个id最多约20个事件时间。理想情况下,事件应按时间排序,即从最低到最高。
由于
答案 0 :(得分:0)
您可以使用函数或存储过程来解决它,以动态构建整个查询。
我通过使用函数buildQuery向您展示如何,见下文!
创建表格事件和数据
create table events (id int, eventtime int);
insert into events values (1, 15);
insert into events values (3, 49);
insert into events values (3, 78);
insert into events values (5, 68);
insert into events values (6, 62);
insert into events values (7, 85);
insert into events values (7, 86);
创建函数buildQuery()
create function buildQuery() returns varchar(4000)
not deterministic
reads sql data
begin
-- variables
declare query varchar(4000);
declare maxcols int;
declare counter int;
-- initialize
set query = '';
set maxcols = 0;
set counter = 0;
-- get the max amount of columns
select count(id) as maxevents into maxcols
from events
group by id
order by maxevents desc limit 1;
-- build the query
while counter < maxcols do
set counter = counter + 1;
set query=concat(query,',replace(substring(substring_index(group_concat(eventtime), '','',', counter,'),length(substring_index(group_concat(eventtime),'','',', counter,'-1)) + 1),'','','''') as event' ,counter);
end while;
-- return
return query;
end//
执行功能
set @q = buildQuery();
set @q = concat('select id ', @q, '
from events
group by id');
prepare stmnt from @q;
execute stmnt;
deallocate prepare stmnt;
运行结果
<强> SqlFiddle 强>