MySQL 交叉表 table

MySQL Crosstab table

我正在尝试为骑自行车的人创建一个 mySQL table,因为他们通过(可变)数量的检查站。我想将结果显示为 table,左列(行 header)中的骑车人信息和顶行(header 列)中的检查站

基本架构:

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;

结果并未填充整个 table 即我只看到骑手第一次通过第一个检查站。如果我在 CONCAT 中使用聚合函数,我会得到必须转换回日期时间的数值?我当然可以只显示日期时间而无需多个步骤吗?

我错过了什么?

TIA。

我猜你刚刚错过了 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

感谢大家的回复和消息 -- 问题是由关系错误和我的逻辑引起的...我现在有比我希望的复杂得多的解决方案,但它有效并且实际上相当健壮。

是的,1000111 最后我确实需要使用聚合函数,并将结果转换回可读格式;只是我完成的许多其他步骤之一:)