MySQL中的列转换

问题描述 投票:2回答:2

我在MySQL中设置了此结果:

ID          Type Email          Degignation  
1000000000  202 [email protected] Entrepreneur
1000000000  234 [email protected] Engineering,Development
1000000000  239 [email protected] CTO

我有很多这样的元组,而不仅仅是三个。我希望Type成为列,最后一列成为它们的行值。如下所示

ID                202         234                     239        Email 
1000000000   Entrepreneur  Engineering,Development    CTO       [email protected]
mysql pivot-table
2个回答
2
投票

这称为数据透视表。产生有点尴尬:

SELECT ID, 
 MAX(CASE Type WHEN 202 THEN Degignation END) AS `202`
 MAX(CASE Type WHEN 234 THEN Degignation END) AS `234`
 MAX(CASE Type WHEN 239 THEN Degignation END) AS `239`
 Email
FROM mytable
GROUP BY ID, Email

注意,在编写查询之前,您必须知道所有不同的Type值。 SQL不允许结果集在表中发现数据值时动态添加更多列。列必须在查询准备时固定。


1
投票

尽管Bill Karwin的回答是正确的查询必须知道已定义的一组列,但是对于动态数据透视查询,可以使用group_concat来破解。>

group_concat

SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN `Type` = ''', `Type`, ''' THEN Degignation END) `Type_', `Type`, '`' ) ) INTO @sql FROM t; SET @sql = CONCAT('SELECT ID, ', @sql, ', Email FROM t GROUP BY ID,Email'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;


但是使用See Demo时,默认限制为1024要连接的字符,其余结果将被截断,因此如果您有很多不同的类型,那么这将棘手的是,尽管您可以增加group_concat的限制手册中提到的长度限制,但也有依赖关系在group_concat

© www.soinside.com 2019 - 2024. All rights reserved.