2013-04-07 68 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,因此您將返回多行結果。