1

我有一个包含 3 列的表:

COLUMN A: DATETIME
COLUMN B: DOUBLE
COLUMN C: INT

列 A 不是唯一的,有许多行具有相同的DATETIME值,但是对于每个DATETIMECOLUMN 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 中是否可行,还是我必须编写一些代码?

4

2 回答 2

2

您想要转置数据,但由于MySQL没有内置PIVOT()函数,您可以使用MAX()and手动完成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;
于 2013-09-27T13:32:03.743 回答
2

这是一个名为数据透视表的常见问题。我的意见是——你应该在应用程序中而不是在 SQL 中这样做——那是因为在 DBMS 中以这种方式行事是不可靠的。想象一下,你将有 100 个不同的值columnC——然后呢?columnC或每个日期时间的不同值计数。

但是如果你仍然想在 MySQL 中这样做,这里是这个问题的一个很好的答案。

于 2013-09-27T13:33:19.727 回答