2017-04-05 113 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