将多行合并为一行

时间:2013-09-27 13:28:57

标签: mysql

我有一个包含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中是否可行,还是我必须编写一些代码?

2 个答案:

答案 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就是解决这个问题的好方法。