在SQL中,我需要将数据从垂直方向转换为水平

时间:2013-12-27 14:19:37

标签: mysql heidisql

我有简单的数据表,其中事件时间与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个事件时间。理想情况下,事件应按时间排序,即从最低到最高。

由于

1 个答案:

答案 0 :(得分:0)

您可以使用函数或存储过程来解决它,以动态构建整个查询。

The sqlfiddle

我通过使用函数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;

运行结果

Events output

<强> SqlFiddle

The sqlfiddle