PostgreSQL SUM CASE выражение с ТОГДА 1, ТО 0, ЛИБО 0 - PullRequest
0 голосов
/ 20 января 2019

Я не мог найти то, что искал, пока искал ответ на мою проблему с выражением CASE. Цель состоит в том, чтобы СУММ подсчитывать вхождения «АКТИВНЫХ» счетов. Однако после просмотра результатов в активном аккаунте, похоже, есть набор параметров, которые я не хочу включать в мое значение SUM. Вот оригинальная СУММА ДЕЛА:

 sum(
    CASE
        WHEN (type_txt = 'ACCOUNT'::text AND status = 'ACTIVE' THEN 1
        ELSE 0
    END) AS accounts_actv

Однако я переработал код для учета особых обстоятельств, когда активный счет не должен учитываться:

 sum(
    CASE
        WHEN (type_txt = 'ACCOUNT' AND status = 'ACTIVE' THEN 1
        WHEN (type_txt = 'ACCOUNT' AND status = 'ACTIVE' AND code = 483 AND open_date < CURRENT_DATE) THEN 0
        ELSE 0
    END) AS accounts_actv

Я так понимаю, THEN 1 ELSE 0 не может иметь условия THEN с 0 ----, поэтому я пытаюсь выяснить, как не включать этот тип учетной записи в SUM

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Поместите дополнительное условие в тот же корпус:

sum(
    CASE
        WHEN 
            type_txt = 'ACCOUNT'::text 
            AND status = 'ACTIVE' 
            AND NOT (code = 483 AND open_date < CURRENT_DATE) 
        THEN 1
        ELSE 0
    END) AS accounts_actv
0 голосов
/ 20 января 2019

CASE возвращает значение первого (сверху вниз) THEN выражения, которое имеет выражение WHEN, которое оценивается как true (и ELSE, если ничего не найдено).Поскольку ваше первое WHEN также верно в случаях, когда второе верно, выбирается первое, а не второе.Всегда ставьте более узкие WHEN перед менее узкими в CASE.

CASE
    WHEN (type_txt = 'ACCOUNT' AND status = 'ACTIVE' AND code = 483 AND open_date < CURRENT_DATE) THEN 0
    WHEN (type_txt = 'ACCOUNT' AND status = 'ACTIVE' THEN 1
    ELSE 0
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...