2017-04-05 151 views
0

我有一张表,在满足某个条件时,我需要从中总结表中的值。在Where子句中使用If/CASE语句

这是我从查询初始表:

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表,并给出了不正确的值作为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子句,甚至是更好的方法来获取最终的正确答案用如果/ case语句的这种情况下,任何想法。

+0

一样的,所以如果一个'LOB'有两个'labels'使用'AdjAAL'第一? –

+0

你的rdbms是什么? –

+0

其MS SQL查询 – Mike

回答

2

使用row_number只选择您想要的标签。

我使用DEMO在Postgres的,但在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

+0

谢谢胡安。我从来没有用过这种方法,我现在试着使用row_number查询,因为在我的问题,它给了我NULL值。我不知道我是否按照错误的方法 – Mike

+0

将'WHERE FileID = 17719'移到'T'内。或者使用'(由FileId分区,LOB' –

+0

太棒了! – Mike

0

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

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