我有一张表,我需要在满足特定条件时对值进行求和。
这是我要查询的初始表:
Worksheet Label LOB Data
-----------------------------------------
Layers AAL EQ-AO-US 64726.02706
Layers AAL EQ-CA 171683.6675
Layers AAL EQ-Int-M 858.9752352
Layers AAL EQ-NM 9225.104696
Layers AAL EQ-PNW 12554.17653
Layers AAL NWS-Int-M 63142.0387
Layers AAL NWS-US 300230.9489
P&L AdjAAL EQ-AO-US 32363.01353
P&L AdjAAL EQ-CA 251180.82
P&L AdjAAL EQ-NM 4612.552348
P&L AdjAAL EQ-PNW 6277.088264
P&L AdjAAL NWS-Int-M 31571.01935
P&L AdjAAL NWS-US 132993.08
我需要在查询中列出所列LOB的数据,并提出最终总和。首先,我需要检查LOB是否有AdjAAL,如果是,则使用那个。否则,我需要使用AAL'建模'该特定LOB的值
MS SQL查询
select FileID,
Sum(cast(Data as float)) as Modeled
from Premium_DATA
where Label in ('AdjAAL','AAL') and LOB in ('NWS-US',
'NWS-Int-M',
'EQ-CA',
'EQ-NM',
'EQ-PNW',
'EQ-AO-US',
'EQ-Int-M',
'StormSurge-US')
and FileID = 17719
group by FileID
以上查询将LOB列表中的所有内容相加,并将THE INCORRECT值设为1081418.51206399。但我希望最终的答案是459856.5487。 (我通过在上表中添加以下数字得到了这个数字)
AdjAAL 32363.01353
AdjAAL 251180.82
AdjAAL 4612.552348
AdjAAL 6277.088264
AdjAAL 31571.01935
AdjAAL 132993.08
AAL 858.9752352
关于如何处理在where子句中使用If / case语句或甚至更好的方法来检索最终正确答案的情况的任何想法。
答案 0 :(得分:2)
使用row_number
仅选择所需的标签。
我在postgres中使用 DEMO 但在MSSQL上使用相同
SELECT * -- SUM("Modeled")
FROM ( SELECT *,
row_number() over (partition by "LOB" ORDER BY "Label" DESC) as rn
FROM Table1 t1
) as T
where t.rn =1
答案 1 :(得分:0)
我不知道你正在使用什么版本的SQL,在SQL Server上你可以在聚合函数中使用CASE结构,例如
select sum(case when DOCID > 100 then 1 else 0 end) as DATA from DOCUMENTS