2016-09-22 125 views
0

我想爲騎自行車的人通過(可變)數量的檢查點時創建一個mySQL表。我想顯示前行中的結果,在左邊的列(行標題)騎車者信息的表和檢查站(列標題)MySQL交叉表

的基本架構:

CREATE TABLE timing (`Bib` int, `checkpoint` tinytext, `time` datetime); 

INSERT INTO timing 
    (`Bib` , `checkpoint` , `time`) 
VALUES 
    (100, 'CP1', '2016-09-22 01:00:00'), 
    (101, 'CP1', '2016-09-22 01:30:00'), 
    (102, 'CP1', '2016-09-22 02:00:00'), 
    (100, 'CP2', '2016-09-22 02:00:00'), 
    (101, 'CP2', '2016-09-22 02:30:00'), 
    (100, 'CP3', '2016-09-22 03:00:00'), 
    (103, 'CP2', '2016-09-22 04:00:00') 
; 

SQL :

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
     CONCAT(
     '(CASE WHEN checkpoint = ''', 
     checkpoint, 
     ''' THEN time else 0 END) AS `', 
     checkpoint, '`' 
    ) 
) INTO @sql 
FROM timing; 

SET @sql 
    = CONCAT('SELECT Bib, ', @sql, ' 
      from timing 
      group by Bib'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

結果是不填充整個表,即我只看到騎手第一次通過第一個檢查點。如果我在CONCAT中使用聚合函數,我得到的數值必須轉換回日期時間?當然,我可以只顯示日期時間而無需多個步驟?

我缺少什麼?

TIA。

+0

請添加您的預期輸出 – 1000111

回答

0

感謝所有的答覆和消息 - 這個問題是由一個關係錯誤引起的,我的邏輯...我現在有比我所希望的更復雜的解決方案,但它的工作原理實際上相當強大。

是的,1000111我確實需要在最後使用聚合函數,並將結果轉換回可讀格式;只是我結束與其他步驟之一:)

0

我猜你只是錯過了MAX

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
     CONCAT(
     'MAX(CASE WHEN checkpoint = ''', 
     checkpoint, 
     ''' THEN time else 0 END) AS `', 
     checkpoint, '`' 
    ) 
) INTO @sql 
FROM timing; 

SET @sql 
    = CONCAT('SELECT Bib, ', @sql, ' 
      from timing 
      group by Bib'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SEE DEMO