我正在使用SQL(在SAS中)。我有一个如下所示的数据集(表):
Y1 Y2 Y3 100 200 300
我想要返回的是两列,如下所示:
Year Value 1 100 2 200 3 300
实现此目的的SQL查询是什么?
答案 0 :(得分:2)
尝试:
SELECT y1 FROM yourtable
UNION ALL
SELECT y2 FROM yourtable
UNION ALL
SELECT y3 FROM yourtable
答案 1 :(得分:2)
在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 |
答案 2 :(得分: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
答案 3 :(得分:0)
将列拆分为列表的一般方法是创建一个笛卡尔积,其中的表中包含的行数与输出中的列数一样多。如何获得这个“表”取决于您使用的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
另一种做法......