Есть ли более простой способ, чем вложенные iifs, подсчитать несовпадающие условия в SQL-сервере
На рисунке ниже показана таблица счетов и результаты, которые я хочу посчитать. Т.е. каждый раз, когда номер счета равен 106844, и результатом является "СООБЩЕНИЕ" или "ESCALATION EMAIL", которое должно учитываться как 1, а любой другой результат считается как 0. То, что я обычно делал бы, это ужасный беспорядок из iifs как
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 и все испортить. Есть идеи?
3 ответа
Не использовать 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"). Это упрощает код.
Почему бы не использовать таблицу поиска, в которой есть учетная запись и результат, и использовать ее? Затем, по мере изменения требований, вы можете обновить таблицу поиска и не беспокоиться о своем коде.
Да... есть
Последний параметр для того, когда условие ложно, все остальное попадет туда.
SUM( IIF([ACCOUNT] = '106719' AND [OUTCOME] IN ('MESSAGE','ESCALATION_EMAIL'),1,0))