我正在使用SQL(在SAS中)。我有一個數據集(表)看起來像這樣:從多列創建許多行和單列
Y1 Y2 Y3 100 200 300
我想什麼,返回的是,像這樣的兩列:
Year Value 1 100 2 200 3 300
什麼是SQL查詢,以達致這?
我正在使用SQL(在SAS中)。我有一個數據集(表)看起來像這樣:從多列創建許多行和單列
Y1 Y2 Y3 100 200 300
我想什麼,返回的是,像這樣的兩列:
Year Value 1 100 2 200 3 300
什麼是SQL查詢,以達致這?
嘗試:
SELECT y1 FROM yourtable
UNION ALL
SELECT y2 FROM yourtable
UNION ALL
SELECT y3 FROM yourtable
假設有對的,也就是說,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
在SQL Server 2005+可以使用UNPIVOT
函數:
select replace(col, 'Y', '') year,
value
from yourtable
unpivot
(
value
for col in (Y1, Y2, Y3)
) unpiv
這是相同的工藝,使用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
兩者都將產生相同的結果:
| YEAR | VALUE |
----------------
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
甲一般方法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
又一個這樣做的方式...
三江源非常多的幫助。我可以看到這將如何工作。 – MrHopko