2012-12-20 44 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 

又一个这样做的方式...