Home > Back-end >  Transposing multiple related columns
Transposing multiple related columns

Time:04-23

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.

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 po2 ro1 ro2 mo1 mo2 mo3
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

Transposing using 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 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

I will like to turn it to something like this. Is that possible?

month year PO RO MO
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

CodePudding user response:

Maybe use a query like below which creates rows as per your design using 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

CodePudding user response:

Unpivot acts similar as union,Use union all in your case

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  
  • Related