1

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

Y1 Y2 Y3
100 200 300

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

年值
1 100
2 200
3 300

实现这一目标的 SQL 查询是什么?

4

4 回答 4

2

尝试 :

SELECT y1 FROM yourtable
UNION ALL
SELECT y2 FROM yourtable
UNION ALL
SELECT y3 FROM yourtable
于 2012-12-20T13:06:47.113 回答
2

在 SQL Server 2005+ 中,您可以使用以下UNPIVOT功能:

select replace(col, 'Y', '') year,
  value
from yourtable
unpivot
(
  value
  for col in (Y1, Y2, Y3)
) unpiv

请参阅带有演示的 SQL Fiddle

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

两者都会产生相同的结果:

| YEAR | VALUE |
----------------
|    1 |   100 |
|    2 |   200 |
|    3 |   300 |
于 2012-12-20T13:17:14.627 回答
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
于 2012-12-20T13:16:04.420 回答
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

只是另一种方法...

于 2012-12-20T13:54:23.320 回答