1

イベント時間が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 万の eventId があり、ID ごとに最大約 20 の eventtimes があります。イベントは、理想的には時間順に、つまり低いものから高いものへと並べられるべきです。

ありがとう

4

1 に答える 1

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;

実行結果

イベント出力

SqlFiddle

The sqlfiddle

于 2013-12-29T16:23:24.560 に答える