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;
感谢大家的回复和消息 -- 问题是由关系错误和我的逻辑引起的...我现在有比我希望的复杂得多的解决方案,但它有效并且实际上相当健壮。
是的,1000111 最后我确实需要使用聚合函数,并将结果转换回可读格式;只是我完成的许多其他步骤之一:)
我正在尝试为骑自行车的人创建一个 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;
感谢大家的回复和消息 -- 问题是由关系错误和我的逻辑引起的...我现在有比我希望的复杂得多的解决方案,但它有效并且实际上相当健壮。
是的,1000111 最后我确实需要使用聚合函数,并将结果转换回可读格式;只是我完成的许多其他步骤之一:)