2017-06-08 26 views
0

下圖顯示了一個帳戶表和我想要計算的結果。也就是說,每次帳號是106844,結果是「MESSAGE」或「ESCALATION EMAIL」,應計爲1,其他任何結果都計爲0.我通常會做的是一堆可怕的IIFs,如有沒有比嵌套的iifs更容易的方法來計算SQL服務器中的不匹配條件

sum(iif([account] = '106719' and [Outcome] in ('MESSAGE','ESCALATION_EMAIL'),1,iif([account] = '310827' and [outcome] <> 'ABORT' and 'CALL_OUTCOME_LB' in ("Call patched to Customer Care","Message Taken"),1,iif(... , 0) as [Total Outcomes] 

等等,但是男人覺得必須有一個更簡單的方法,或者更少一個在第7個嵌套iif中隨機犯一個錯誤,並搞亂整個事情。有任何想法嗎?

input

回答

5

不要使用iif()。這是一個帶入SQL Server的功能,用於向後兼容MS ACCESS。爲什麼你想要向後兼容這樣的事情?

使用ANSI標準CASE表達:

sum(case when account = '106719' and Outcome in ('MESSAGE', 'ESCALATION_EMAIL') 
      then 1 
      when account = '310827' and outcome <> 'ABORT' and 
       'CALL_OUTCOME_LB' in ("Call patched to Customer Care", "Message Taken") 
      then 1 
      . . . 
      else 0 
     end) as Total_Outcomes 

我也建議您命名列,以便他們不需要被轉義做(爲什麼「總成果」成爲「Total_Outcomes」)。這簡化了代碼。

+0

正是我所追求的,也是一個有用的提示。謝謝。 – tomdemaine

+0

@GordonLinoff我沒有看到兩者之間的功能差異,而我所做的小型性能測試顯示完全沒有區別。如果有一個_need_是ANSII的標準,那就這樣吧;然而,大多數時候不需要它,編寫查詢的一般規則是增強人的可讀性 - 這是我使用顯着縮短的IIF語法的情況。 – Eli

-1

是啊......有
最後一個參數是當條件爲false時,其他所有東西都會落在那裏。

SUM(IIF([ACCOUNT] = '106719' AND [OUTCOME] IN ('MESSAGE','ESCALATION_EMAIL'),1,0)) 
1

爲什麼不使用具有帳戶和結果的查找表並使用它?然後,隨着需求的變化,您可以更新查找表而不用擔心代碼。

+0

這是我的建議。每個帳戶/結果組合一行(因此每個帳戶可能有多行)。使查詢變得微不足道,以便稍後寫*和*以方便修改。 –

相關問題