Mysql查询动态地将行转换为列

Mysql查询动态地将行转换为列

MySQL可以将列转换为行,动态添加行所需的列数。我认为我的问题可能与数据透视表有关,但我不确定,除了通过给出以下示例,我不知道如何构建这个问题。


给出两个表A和B,看起来像


表A.


+--+-----+----+

|id|order|data|

+--+-----+----+

|1 |1    |P   |

+--+-----+----+

|2 |2    |Q   |

+--+-----+----+

|2 |1    |R   |

+--+-----+----+

|1 |2    |S   |

+--+-----+----+

我想编写一个如下所示的查询:


结果表


+--+-----+-----+

|id|data1|data2|

+--+-----+-----+

|1 |P    |S    |

+--+-----+-----+

|2 |R    |Q    |

+--+-----+-----+

基本上我想将表B中的每一行转换为结果表中的一列。如果在表B中为id = 1添加了一个新条目,那么我希望结果表自动扩展一列以容纳这个额外的数据点。


明月笑刀无情
浏览 993回答 2
2回答

ABOUTYOU

您可以使用GROUP BY和MAX模拟数据透视。MySQL也支持IF声明。SELECT  ID,         MAX(IF(`order` = 1, data, NULL)) data1,         MAX(IF(`order` = 2, data, NULL)) data2FROM    TableAGROUP   BY IDSQLFiddle演示如果您有多个值order,则动态SQL可能更合适,因此您不必修改查询:SET @sql = NULL;SELECT   GROUP_CONCAT(DISTINCT     CONCAT(       'MAX(IF(`order` = ', `order`, ',data,NULL)) AS data', `order`)   ) INTO @sqlFROM TableName;SET @sql = CONCAT('SELECT  ID, ', @sql, '                    FROM    TableName                   GROUP   BY ID');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;SQLFiddle演示SQLFiddle演示(另一个例子)两种查询的输出:╔════╦═══════╦═══════╗║ ID ║ DATA1 ║ DATA2 ║╠════╬═══════╬═══════╣║  1 ║ P     ║ S     ║║  2 ║ R     ║ Q     ║╚════╩═══════╩═══════╝

慕无忌1623718

你需要使用MAX和GROUP BY模拟一个PIVOT:SELECT Id,    MAX(CASE WHEN Order = 1 THEN data END) data1,    MAX(CASE WHEN Order = 2 THEN data END) data2FROM TableAGROUP BY Id这是SQL小提琴。
打开App,查看更多内容
随时随地看视频慕课网APP