2016-09-22 103 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