我在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]
这称为数据透视表。产生有点尴尬:
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不允许结果集在表中发现数据值时动态添加更多列。列必须在查询准备时固定。
尽管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