我有一个包含3列的表格:
COLUMN A: DATETIME
COLUMN B: DOUBLE
COLUMN C: INT
A列不唯一有很多行具有相同的DATETIME
值,但是对于每个DATETIME
,COLUMN C都是唯一的。
背景:有人在5个不同位置测量温度,并将其存储在数据库中:
COLUMN A | COLUMN B | COLUMN C
12:00 | 23.4 | 4
12:00 | 24.4 | 5
12:00 | 25.4 | 6
12:01 | 26.4 | 4
12:01 | 27.4 | 5
12:01 | 28.4 | 6
我想将此(在新的表格或视图中)转换为:
COLUMN AA | COLUMNC_VALUE-4 | COLUMNC_VALUE-5 | COLUMNC_VALUE 6
12:00 | 23.4 | 24.4 | 25.4
12:01 | 26.4 | 27.4 | 28.4
C列中的值可以在另一个表中找到。
这在SQL中是否可行,还是我必须编写一些代码?
答案 0 :(得分:2)
您想转置数据但由于MySQL
没有内置PIVOT()
功能,您可以使用MAX()
和CASE
手动执行此操作。
SELECT ColA,
MAX(CASE WHEN ColC = 4 THEN ColB END) ColC_V4,
MAX(CASE WHEN ColC = 5 THEN ColB END) ColC_V5,
MAX(CASE WHEN ColC = 6 THEN ColB END) ColC_V6
FROM TableName
GROUP BY ColA
但是,如果ColC
中的值数量未知,则更好的方法是动态执行,
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('MAX(CASE WHEN ColC = ''',
ColC,
''' THEN ColB ELSE NULL END) AS ',
CONCAT('`ColC_V', ColC, '`')
)) INTO @sql
FROM TableName;
SET @sql = CONCAT('SELECT ColA, ', @sql, '
FROM TableName
GROUP BY ColA');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
答案 1 :(得分:2)
这是一个名为pivot table的常见问题。我的观点是 - 你应该在应用程序中而不是在SQL中这样做 - 这是因为在DBMS中以这种方式行事是不可靠的。想象一下,columnC
将有100个不同的值 - 那么呢?或者每个日期时间的columnC
值不同。
但是如果你仍然想在MySQL中这样做,那么here就是解决这个问题的好方法。