2017-06-08 23 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

这是我的建议。每个帐户/结果组合一行(因此每个帐户可能有多行)。使查询变得微不足道,以便稍后写*和*以方便修改。 –

相关问题