我有一个SQL表,其中包含列FundId,BreakdownName,BreakdownType和BreakdownValue
FundId BreakdownName BreakdownType BreakdownValue
F00000OCVS Cash Long 10.69
F00000OCVS Cash Net 3.17
我希望结果表将fundid和Breakdownvalue显示为Breadkdownname和细分类型组合的别名
因此,例如,上表应为
FundId CashLong CashNet
F00000OCVS 10.69 3.17
我尝试使用case语句作为
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'
但这给了我多行资金。第一行具有CashLong的值,但CashNet为空。第二行具有CashNet的值,但CashLong为空。我想将它们放在一行中。
我尝试使用临时表并插入但结果相同。
有人可以帮我吗?
答案 0 :(得分:1)
非常确定您可以轻松进行条件聚合。像这样的东西。
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
答案 1 :(得分:0)
我认为您正在寻找sql server中的数据透视功能: https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-2017 这应该能够像您在此处需要的那样用列“翻转”行。
您可能需要将数据透视功能与子查询结合起来以准备数据(例如,将concat BreakdownName和BreakdownType在一起,然后使用该列进行数据透视。我会发布一些示例代码,但手头没有sql server atm。)