下图显示了一个帐户表和我想要计算的结果。即每次帐号为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中犯下随机错误并弄乱整个事情。有什么想法吗?
答案 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))