2013-03-19 172 views
2

我有兩個表三倍和標籤透視表使用MySQL

三同表有以下欄目

id PostID TagID Value 
    1 1  1  Murder 
    2 1  2  New Brunswick 
    3 2  1  Theft 
    4 2  3  Gun 

標籤表有以下欄目

id TagName 
    1 Incident 
    2 Location 
    3 Weapon  

我試圖寫sql用動態頭創建數據透視表

輸出應該是這樣的

 PostID Incident Location   Weapon   
      1 Murder  New Brunswick  
      2 Theft      Gun 

任何幫助編寫SQL將不勝感激。我在網上看到的例子,但無法弄清楚這一個

+0

SQLFiddle(http://sqlfiddle.com)是檢驗思想的巨大資源。 – 2013-03-19 21:21:38

+0

可能重複的[MySQL數據透視列到動態列數](http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns) – RichardTheKiwi 2013-05-03 09:16:02

回答

11

爲了在MySQL中的數據,您需要同時使用聚合函數和CASE表達。

如果你有一個已知的列數,那麼你可以硬編碼查詢:

select p.postid, 
    max(case when t.tagname = 'Incident' then p.value end) Incident, 
    max(case when t.tagname = 'Location' then p.value end) Location, 
    max(case when t.tagname = 'Weapon' then p.value end) Weapon 
from triples p 
left join tags t 
    on p.tagid = t.id 
group by p.postid; 

SQL Fiddle with Demo

但是,如果你有一個未知的列數,那麼你就需要使用準備好的語句生成動態SQL:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(CASE WHEN TagName = ''', 
     TagName, 
     ''' THEN p.value END) AS `', 
     TagName, '`' 
    ) 
) INTO @sql 
FROM tags; 


SET @sql 
    = CONCAT('SELECT p.postid, ', @sql, ' 
      from triples p 
      left join tags t 
      on p.tagid = t.id 
      group by p.postid'); 

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

請參閱SQL Fiddle with Demo

雙方將給出結果:

| POSTID | INCIDENT |  LOCATION | WEAPON | 
---------------------------------------------- 
|  1 | Murder | New Brunswick | (null) | 
|  2 | Theft |  (null) | Gun | 
+0

非常感謝藍色的腳 – Swakesh 2013-03-19 22:32:48