MySQL中的行到列转换

时间:2014-08-31 18:16:50

标签: mysql mysqli mysql-workbench pivot-table

我在MySQL中有这个结果集:

ID          Type Email          Degignation  
1000000000  202 brijesh@abc.com Entrepreneur
1000000000  234 brijesh@abc.com Engineering,Development
1000000000  239 brijesh@abc.com CTO

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

ID                202         234                     239        Email 
1000000000   Entrepreneur  Engineering,Development    CTO       brijesh@abc.com

2 个答案:

答案 0 :(得分: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 :(得分:1)

虽然Bill Karwin的答案是正确的,但查询必须知道已定义的列集,但对于动态数据透视查询,使用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


  

但是使用group_concat时默认限制为1024   连接的字符和剩余的结果将被截断   如果你有很多不同的类型,那么这将是   棘手,虽然你可以增加group_concat的限制   手册中提到的长度约束,但它也有依赖性   在max_allowed_packet