我正在使用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