从许多列创建许多行和单个列

时间:2012-12-20 13:04:02

标签: sql unpivot

我正在使用SQL(在SAS中)。我有一个如下所示的数据集(表):

 Y1  Y2  Y3
100 200 300

我想要返回的是两列,如下所示:

Year  Value
1     100
2     200
3     300

实现此目的的SQL查询是什么?

4 个答案:

答案 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

请参阅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 |

答案 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

另一种做法......