Есть ли более простой способ, чем вложенные 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))
Другие вопросы по тегам