简体   繁体   English

将多行合并为一行

[英]Combine multiple rows to one row

I have a table with 3 columns: 我有一个有3列的表:

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

Column A is not unique there are many rows with the same DATETIME value, however for every DATETIME COLUMN C is unique. A列不是唯一的,有许多行具有相同的DATETIME值,但是对于每个DATETIME COLUMN C都是唯一的。

Background: Somebody measured on 5 different positions a temperature and this is stored in the database as: 背景:有人在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

I would like to transform this (in a new table or view) into something like: 我想将此(在新表或视图中)转换为:

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

The values in Column C can be found in another table. C列中的值可以在另一个表中找到。

Is this possible in SQL or do I have to write some code? 这可能在SQL中还是我必须编写一些代码?

You want to transpose data but since MySQL does not have a builtin PIVOT() function, you can manually do it using MAX() and CASE . 您想要转置数据,但由于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

However, if you have unknown number of values in ColC , a much better way is to do in dynamically, 但是,如果您在ColC有未知数量的值, 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;

It is a common problem named pivot table . 这是一个名为数据透视表的常见问题。 And my opinion is - you should do that in application, not in SQL - that is because it's unreliable to act such way in DBMS. 我的观点是 - 你应该在应用程序中而不是在SQL中这样做 - 这是因为在DBMS中以这种方式行事是不可靠的。 Imagine you will have 100 different values for columnC - what then? 想象一下,你将为columnC提供100个不同的值 - 那么呢? Or different count of columnC values per one datetime. 或者每个日期时间的columnC值的计数不同。

But if you still want to do that in MySQL, here is a good answer for this issue. 但是,如果你仍然想这样做在MySQL, 这里是这个问题一个很好的答案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM