转置多个相关列

Bri*_*tle 1 sql t-sql sql-server unpivot cross-apply

虽然转置单列非常简单,但我需要转置大量数据,其中需要转置 3 组、10 多个相关列。

create table test
(month int,year int,po1 int,po2 int,ro1 int,ro2 int,mo1 int,mo2 int, mo3 int);

insert into test 
values
(5,2013,100,20,10,1,3,4,5),(4,2014,200,30,20,2,4,5,6),(6,2015,200,80,30,3,5,6,7) ;

select * FROM test;
Run Code Online (Sandbox Code Playgroud)

给出

波1 氧分压 罗1 罗2 莫1 莫3
5 2013年 100 20 10 1 3 4 5
4 2014年 200 30 20 2 4 5 6
6 2015年 200 80 30 3 5 6 7

使用 UNPIVOT 转置

select
  month, year, 
  PO, RO, MO
from ( SELECT * from test) src

unpivot
    ( PO for Description in (po1, po2))unpiv1
unpivot
    (RO for Description1 in (ro1, ro2)) unpiv2
unpivot
    (MO for Description2 in (mo1, mo2, mo3)) unpiv3

order by year
Run Code Online (Sandbox Code Playgroud)

给我这个

采购订单 反渗透
5 2013年 100 10 3
5 2013年 100 10 4
5 2013年 100 10 5
5 2013年 100 1 3
5 2013年 100 1 4
5 2013年 100 1 5
5 2013年 20 10 3
5 2013年 20 10 4
5 2013年 20 10 5
5 2013年 20 1 3
5 2013年 20 1 4
5 2013年 20 1 5
4 2014年 200 20 4
4 2014年 200 20 5
4 2014年 200 20 6
4 2014年 200 2 4
4 2014年 200 2 5
4 2014年 200 2 6
4 2014年 30 20 4
4 2014年 30 20 5
4 2014年 30 20 6
4 2014年 30 2 4
4 2014年 30 2 5
4 2014年 30 2 6
6 2015年 200 30 5
6 2015年 200 30 6
6 2015年 200 30 7
6 2015年 200 3 5
6 2015年 200 3 6
6 2015年 200 3 7
6 2015年 80 30 5
6 2015年 80 30 6
6 2015年 80 30 7
6 2015年 80 3 5
6 2015年 80 3 6
6 2015年 80 3 7

我想把它变成这样。那可能吗?

采购订单 反渗透
5 2013年 100 10 3
5 2013年 20 1 4
5 2013年 0 0 5
4 2014年 200 20 4
4 2014年 30 2 5
4 2014年 0 0 6
6 2015年 200 30 5
6 2015年 80 3 6
6 2015年 0 0 7

Dhr*_*shi 5

也许使用如下所示的查询,该查询使用 CROSS APPLY 根据您的设计创建行

select month,year,po,ro,mo from 
test cross apply 
(values (po1,ro1,mo1), (po2,ro2,mo2),(0,0,mo3))v(po,ro,mo)
Run Code Online (Sandbox Code Playgroud)

在这里查看演示