2013-04-07 57 views
-1

我有一个我从另一个插件使用的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城市等

我希望能够diplay的数据列:

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

谁能想到如何使用MySQL声明去做这个?

+0

如何将名称链接到地址? – 2013-04-07 20:00:06

回答

0

这种从行到列的转换称为枢轴。 MySQL没有透视功能,但可以使用带有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,因此您将返回多行结果。