With the sql query I get table 1
with t as(QUERY) select Date, key, Type, row_number ( ) over(partition by key order by Date asc) orders from t
table 1
Date Key Type orders 12/10/2007 7 Q1 1 30/06/2015 7 W 2 21/06/2019 7 G1 3 31/01/2008 9 Q5 1 5/02/2016 9 W3 2 17/12/2019 9 G2 3 12/10/2007 10 Q12 1 5/02/2016 10 W4 2 17/12/2019 10 G6 3
Trying to pivot using window functions below on Server 2012 fails
create extension if not exists tablefunc;
select * from crosstab ($$
with t as(QUERY)
select Date, key, Type,
row_number ( ) over(partition by key order by Date asc) :: integer as orders
from t
$$) as ct (key varchar
"1" integer,
"2" integer,
"3" integer)
order by key asc
My desired output
1 2 3 7 Q1 W G1 9 Q5 W3 G2 10 Q12 W4 G6
Advertisement
Answer
Use conditional aggregation
select key,
max(case when order=1 then type end) as '1',
max(case when order=2 then type end) as '2',
max(case when order=3 then type end) as '3'
from tablename
group by key
Also, you can try with pivot –
SELECT key, piv.* FROM
(
select Date, key, Type,
row_number ( ) over(partition by key order by Date asc) orders
from t
) X
PIVOT(
max(type )
FOR orders IN (
[1], [2], [3]
)
) AS piv