简体   繁体   English

转置多个相关列

[英]Transposing multiple related columns

While transposing single columns is pretty straight forward I need to transpose a large amount of data with 3 sets of, 10+ related columns needed to be transposed.虽然转置单列非常简单,但我需要转置大量数据,需要转置 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;

gives

month year po1 PO1 po2氧分压 ro1 ro1 ro2 ro2 mo1 mo1 mo2 mo2 mo3 mo3
5 5个 2013 2013 100 100 20 20 10 10 1 1个 3 3个 4 4个 5 5个
4 4个 2014 2014 200 200 30 30 20 20 2 2个 4 4个 5 5个 6 6个
6 6个 2015 2015年 200 200 80 80 30 30 3 3个 5 5个 6 6个 7 7

Transposing using UNPIVOT使用 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

Gives me this给我这个

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

I will like to turn it to something like this.我想把它变成这样的东西。 Is that possible?那可能吗?

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

Maybe use a query like below which creates rows as per your design using CROSS APPLY也许使用像下面这样的查询,它使用 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)

see demo here 在这里看演示

Unpivot acts similar as union ,Use union all in your case Unpivot行为类似于union ,在你的情况下使用union all

SELECT month,
       year,
       po1 AS PO,
       ro1 AS RO,
       mo1 AS MO
FROM   test
UNION ALL
SELECT month,
       year,
       po2,
       ro2,
       mo2
FROM   test
UNION ALL
SELECT month,
       year,
       0,
       0,
       mo2
FROM   test  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM