我需要从几行创建几个列

时间:2013-04-07 19:57:00

标签: mysql case

我有一个我从另一个插件使用的MYSQL表。该表有两个名为element_value和element_label的字段。

element_value包含我想为其创建报​​告的2500人的姓名,地址,城市,州和邮政编码。但是,我想采取每一行并创建它自己的列。

例如,表格如下所示:

**element_value**
John Smith
100 Elm Street
Columbus
Ohio
13579

element_label用作索引。 element_label 1涉及名称,2涉及地址,3涉及城市等。

我希望能够在列中显示数据:

Name       Address        City       State       Zip
John Smith 100 Elm Street Columbus   Ohio        13579

有人能想到如何使用MYSQL语句来做到这一点吗?

1 个答案:

答案 0 :(得分:0)

从行到列的这种转换称为 pivot 。 MySQL没有pivot函数,但可以使用带有CASE表达式的聚合函数来复制它。

您可以使用以下内容:

select
  max(case when element_label = 'Name' then element_value end) Name,
  max(case when element_label = 'Address' then element_value end) Address,
  max(case when element_label = 'State' then element_value end) State,
  max(case when element_label = 'City' then element_value end) City,
  max(case when element_label = 'Zip' then element_value end) Zip
from yt

请参阅SQL Fiddle with Demo

如果您要将未知数量的值转换为列,则可以使用预准备语句生成动态sql:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN element_label = ''',
      element_label,
      ''' THEN element_value else null END) AS `',
      element_label, '`'
    )
  ) INTO @sql
FROM yt;

SET @sql 
  = CONCAT('SELECT ', @sql, ' 
            from yt
            ');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL Fiddle with Demo。两个查询都给出了结果:

|       NAME |        ADDRESS |     CITY | STATE |   ZIP |
----------------------------------------------------------
| John Smith | 100 Elm Street | Columbus |  Ohio | 13579 |

通常,您将拥有一个您也将分组的列。例如,如果您有一个record_id列,那么您将添加GROUP BY record_id,因此您将返回多行结果。