2012-12-20 53 views
1

我正在使用SQL(在SAS中)。我有一個數據集(表)看起來像這樣:從多列創建許多行和單列

 Y1 Y2 Y3 
100 200 300

我想什麼,返回的是,像這樣的兩列:

Year Value 
1  100 
2  200 
3  300

什麼是SQL查詢,以達致這?

回答

2

嘗試:

SELECT y1 FROM yourtable 
UNION ALL 
SELECT y2 FROM yourtable 
UNION ALL 
SELECT y3 FROM yourtable 
+0

三江源非常多的幫助。我可以看到這將如何工作。 – MrHopko

1

假設有對的,也就是說,ID列主鍵:

ID Y1 Y2 Y3 
    1 100 200 300 

那麼這樣的事情應該工作

SELECT MOCKTABLE.* FROM (
    SELECT 1 AS Year, Y1 AS VALUE FROM x WHERE ID = y 
    UNION ALL 
    SELECT 2 AS Year, Y2 AS VALUE FROM x WHERE ID = y 
    UNION ALL 
    SELECT 3 AS Year, Y3 AS VALUE FROM x WHERE ID = y 
) MOCKTABLE 
2

在SQL Server 2005+可以使用UNPIVOT函數:

select replace(col, 'Y', '') year, 
    value 
from yourtable 
unpivot 
(
    value 
    for col in (Y1, Y2, Y3) 
) unpiv 

參見SQL Fiddle with Demo

這是相同的工藝,使用UNION ALL查詢:

select 1 Year, Y1 value 
from yourtable 
union all 
select 2 Year, Y2 value 
from yourtable 
union all 
select 3 Year, Y3 value 
from yourtable 

參見SQL Fiddle with Demo

兩者都將產生相同的結果:

| YEAR | VALUE | 
---------------- 
| 1 | 100 | 
| 2 | 200 | 
| 3 | 300 | 
0

甲一般方法unpivot列是創建一個笛卡爾產品,其中有一個表格,其中包含儘可能多的行,因爲您需要輸出中的列。你如何得到這個「表」取決於你正在使用的RDBMS。下面是一個Oracle例如:

select 
r "Year", 
case r when 1 then y1 when 2 then y2 when 3 then y3 else null end "Value" 
from 
t1, (select level r from dual connect by level <= 3) 

其中給出:

Year Value 
1 100 
2 200 
3 300 

又一個這樣做的方式...