I am having problem with pivoting a table in SQL Server 2016. Consider the following data/query
x
WITH DATA1 AS
(
SELECT 123 cid, 'test' cname, '2020-03-17' dt, 'BELLE' fc, 3782703 mn union all
SELECT 123 cid, 'test' cname, '2020-03-12' dt, 'WOO' fc, 25679 mn union all
SELECT 345 cid, 'test2' cname, '2019-03-17' dt, 'king' fc, 3782703 mn union all
SELECT 345 cid, 'test2' cname, '2019-03-12' dt, 'east' fc, 25679 mn union all
SELECT 111 cid, 'test3' cname, '2019-02-12' dt, 'east' fc, 2 mn
)
select *
from DATA1
PIVOT (
MAX(mn) FOR fc IN (
[BELLE]
,[WOO]
,[KING]
,[EAST]
)
) a
I’m trying to pivot on dt and mn for the values in fc. So basically I am looking for this output.
cid cname fc1_dt fc1_name fc1_mn fc2_name fc2_dt fc2_mn
123 test 2020-03-17 BELLE 3782703 woo 2020-03-12 25679
345 test2 2019-03-17 king 37 east 2019-03-12 25
111 test3 2019-02-12 east 2
I was trying to add to max
function like this but it doesn’t work
PIVOT (
MAX(mn),max(dt) FOR fc IN (
[BELLE]
,[WOO]
,[KING]
,[EAST]
)
) a
Can someone please help modify my query to produce the output above?
Advertisement
Answer
One option uses row_number()
and conditional aggregation. Assuming that you want the latest date in the first column:
select cid, cname,
max(case when rn = 1 then dt end) fc1_dt,
max(case when rn = 1 then fc end) fc1_name,
max(case when rn = 1 then mn end) fc1_mn,
max(case when rn = 2 then dt end) fc2_dt,
max(case when rn = 2 then fc end) fc2_name,
max(case when rn = 2 then mn end) fc2_mn
from (
select d.*, row_number() over(partition by cid, cname order by dt desc) rn
from data1 d
) d
group by cid, cname
If you want to handle more than 2 rows per group, then you need to expand the select
clause with more conditional expressions.
cid | cname | fc1_dt | fc1_name | fc1_mn | fc2_dt | fc2_name | fc2_mn --: | :---- | :--------- | :------- | ------: | :--------- | :------- | -----: 123 | test | 2020-03-17 | BELLE | 3782703 | 2020-03-12 | WOO | 25679 345 | test2 | 2019-03-17 | king | 3782703 | 2019-03-12 | east | 25679 111 | test3 | 2019-02-12 | east | 2 | null | null | null