在Case语句的表的其他列中将列别名用作值

时间:2019-02-07 21:47:36

标签: sql sql-server

我有一个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为空。我想将它们放在一行中。

我尝试使用临时表并插入但结果相同。

有人可以帮我吗?

2 个答案:

答案 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。)