web-dev-qa-db-ja.com

MySQLの行を列名として転置-動的

私の目標は、チケットのタイムスタンプの作成とクローズの時間差を計算できるようにすることです。再オープンした場合は、再オープンからクローズに時間を追加します。次のように、ost_ticket_eventという既存のmySQLテーブルがあります。

ost_ticket_event TABLE

このテーブルを下のように表示する必要があります。この場合、状態は動的である可能性があります。つまり、作成、クローズ、割り当て、転送、または再オープンです。 1つのticket_idの状態は、複数回閉じたり開いたりすることができます。

ticket_id//////CREATED///////////////CLOSED//////////////REOPENED/////////////CLOSED2//  
1-----------18-01/15 12:00 -------18-01/15 13:00------18-01/15 13:30------18-01/15 14:00   
2-----------19-01/15 10:00--------20-01/15 09:00-------------NULL------------NULL  

LEFT JOIN Group CONCATを試しましたが、希望の結果が得られないようです。

これは私のクエリです:

SET group_concat_max_len=20000;

SET @a = 0;
SET @b = 0;
SET @num := 0;
SET @ticket_id := ''; 

SET @line1 =    CONCAT ( 
 'SELECT ', 
 (
  SELECT CONCAT('ticket_id,', GROUP_CONCAT(' state',@a:=@a+1,', timestamp',@a))     
  FROM ost_ticket_event as ts1
  WHERE ticket_id = 
  ( 
   SELECT ticket_id
   FROM ost_ticket_event tm
   GROUP BY ticket_id
   LIMIT 1
  )
 ),
 ' FROM ost_ticket_event' ,
 (
  SELECT CONCAT(' ', REPLACE(REPLACE(GROUP_CONCAT(' LEFT JOIN ( SELECT ticket_id as         ticket_id',@b:=@b+1,'| state as state',@b,'| timestamp as timestamp',@b,' FROM ( SELECT *| @num := IF(@ticket_id = ticket_id| @num + 1| 1) AS row_number| @ticket_id := ticket_id AS dummy FROM ost_ticket_event ORDER BY ticket_id) AS x',@b,' WHERE x',@b,'.row_number = ',@b,') as t',@b,' ON  ticket_id',@b,' = ticket_id'),',',' '),'|',','))      
  FROM ost_ticket_event as ts2
  WHERE ticket_id = 
  ( 
  SELECT ticket_id
      FROM ost_ticket_event tm
   GROUP BY ticket_id
   LIMIT 1
  )
 ),
 ' GROUP BY ticket_id'
);

PREPARE my_query FROM @line1;
EXECUTE my_query;

これは出力です:

SQL RESULT

1
DBGUY

私はそれを解決しました、誰かが次のクエリがそれをしたことを知りたいのであれば:

SELECT CONCAT(
'SELECT `ost_ticket_event`.ticket_id', GROUP_CONCAT('
 ,    `t_', REPLACE(state, '`', '``'), '`.timestamp
     AS `', REPLACE(state, '`', '``'), '`'
 SEPARATOR ''),
' FROM `ost_ticket_event` ', GROUP_CONCAT('
 LEFT JOIN `ost_ticket_event`   AS `t_', REPLACE(state, '`', '``'), '`
        ON `ost_ticket_event`. ticket_id = `t_', REPLACE(state, '`', '``'), '`.ticket_id
       AND `t_', REPLACE(state, '`', '``'), '`.state = ', QUOTE(state)
 SEPARATOR ''),
' GROUP BY `ost_ticket_event`.ticket_id'
) INTO @qry FROM (SELECT DISTINCT state FROM `ost_ticket_event`) t;

PREPARE stmt FROM @qry;
EXECUTE stmt;
1
DBGUY