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