I have a sql table that has columns FundId, BreakdownName, BreakdownType and BreakdownValue
x
FundId BreakdownName BreakdownType BreakdownValue
F00000OCVS Cash Long 10.69
F00000OCVS Cash Net 3.17
I want result table show fundid and Breakdownvalue as alias of combination of breadkdownname and breakdowntype
so for example, above table should result into
FundId CashLong CashNet
F00000OCVS 10.69 3.17
I tried doing it with case statement as
select
a.FundID,
b.CashLong,
b.CashNet
from a
inner join ( select FundID,
case when BreakdownName = 'Cash' and BreakdownType = 'Long' then BreakdownValue end as 'CashLong',
case when BreakdownName = 'Cash' and BreakdownType = 'Net' then BreakdownValue end as 'CashNet'
from Morningstar.dbo.mstardatawarehouseassetallocationbreakdownvertical
where FundShareClassID = 'F00000OCVS') b
on a.FundShareClassID = b.FundShareClassID
where a.FundShareClassID = 'F00000OCVS'
But this is giving me multiple rows for fund. First row has value for CashLong but CashNet is null. Second row has value for CashNet but CashLong is null. I want to have them in single row.
I tried doing it using temp table and insert but same result.
Can someone please help me with it?
Advertisement
Answer
Pretty sure you can do easily with conditional aggregation. Something like this.
select bdv.FundId
, CashLong = max(case when bdv.BreakdownType = 'Long' then bdv.BreakdownValue end)
, CashNet = max(case when bdv.BreakdownType = 'Net' then bdv.BreakdownValue end)
from Morningstar.dbo.mstardatawarehouseassetallocationbreakdownvertical bdv
group by bdv.FundId