2013-11-21 42 views
1

我有一個包含一些名稱引用的表。將列作爲行返回

與查詢:

SELECT id, n1, n2, n3 
FROM nametable 

返回表:

+----+--------+-------+--------+ 
| id | n1 | n2 | n3 | 
+----+--------+-------+--------+ 
| 1 | Larry | Bob | Mo  | 
| 2 | Sara | May | (NULL) | 
| 3 | Keiran | Lenny | (NULL) | 
+----+--------+-------+--------+

我想它返回爲:

+----+--------+ 
| id | n | 
+----+--------+ 
| 1 | Larry | 
| 1 | Bob | 
| 1 | Mo  | 
| 2 | Sara | 
| 2 | May | 
| 3 | Keiran | 
| 3 | Lenny | 
+----+--------+

需要注意的是(NULL)值不返回最終結果

我做了一些研究,發現了一些名爲「數據透視表」的內容。但是,沒有一個例子符合我的條件。我想在每一行中保留id。

我將如何使用查詢來做到這一點?

+1

我不相信MySQL有像SQL Server這樣的'PIVOT'。 –

回答

3

我認爲這是在MySQL最近的:

select * from (
(select id, n1 as n from nametable) union all 
(select id, n2 as n from nametable) union all 
(select id, n3 as n from nametable) 
) x 
0

您也可以UNPIVOT你的表這樣

SELECT id, 
     CASE n 
      WHEN 1 THEN n1 
      WHEN 2 THEN n2 
      WHEN 3 THEN n3 
     END n 
    FROM nametable t CROSS JOIN 
(
    SELECT 1 n UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 3 
) i 
HAVING n IS NOT NULL 
ORDER BY id, n; 

輸出:

 
| ID |  N | 
|----|--------| 
| 1 | Bob | 
| 1 | Larry | 
| 1 |  Mo | 
| 2 | May | 
| 2 | Sara | 
| 3 | Keiran | 
| 3 | Lenny | 

這裏是SQLFiddle演示