在Where子句中使用If / CASE语句

时间:2017-04-05 18:36:16

标签: sql sql-server

我有一张表,我需要在满足特定条件时对值进行求和。

这是我要查询的初始表:

  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语句或甚至更好的方法来检索最终正确答案的情况的任何想法。

2 个答案:

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

enter image description here

答案 1 :(得分:0)

我不知道你正在使用什么版本的SQL,在SQL Server上你可以在聚合函数中使用CASE结构,例如

select sum(case when DOCID > 100 then 1 else 0 end) as DATA from DOCUMENTS