有没有比嵌套的iif更简单的方法来计算SQL服务器中不匹配的条件

时间:2017-06-08 14:27:21

标签: sql sql-server iif

下图显示了一个帐户表和我想要计算的结果。即每次帐号为106844,结果为" MESSAGE"或者" ESCALATION EMAIL"应该算作1,其他任何结果都算为0.我通常会做的是像IFF这样可怕的混乱

   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

3 个答案:

答案 0 :(得分: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”变为“Total_Outcomes”)。这简化了代码。

答案 1 :(得分:1)

为什么不使用具有Account and Outcome的查找表并使用它?然后,随着需求的变化,您可以更新查找表,而不必担心您的代码。

答案 2 :(得分:-1)

是的......有 最后一个参数是当条件为假时,其他一切都将落在那里。

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