Выражение CASE, возвращающее NULL, когда с другими инструкциями case, возвращает ожидаемый результат, когда один - PullRequest
0 голосов
/ 04 июня 2019

Когда я запускаю только эту строку кода, я получаю ожидаемый результат 1:

sum(case when facilityname like '%AT%' then count(status) else 0 end) as AT_all_status

Однако, когда я запускаю несколько операторов case вместе, как показано в этом примере, все операторы case возвращают NULL:

sum(case when facilityname like '%AT%' then count(status) else 0 end) as AT_all_status,
sum(case when facilityname like '%AT%' and status in ('Current','Approved') then count(status) else 0 end) as AT_approved_current,
sum(case when facilityname like '%CZ%' then count(status) else 0 end) as CZ_all_status,
sum(case when facilityname like '%CZ%' and status in ('Current','Approved') then count(status) else 0 end) as CZ_approved_current,
sum(case when facilityname like '%FGE%' then count(status) else 0 end) as FGE_all_status,
sum(case when facilityname like '%FGE%' and status in ('Current','Approved') then count(status) else 0 end) as FGE_approved_current,
sum(case when facilityname like '%FRA%' then count(status) else 0 end) as FRA_all_status,
sum(case when facilityname like '%FRA%' and status in ('Current','Approved') then count(status) else 0 end) as FRA_approved_current

Когда они на самом деле должны возвращать свои собственные числа и делать это при запуске в одиночку, есть ли здесь поведение оператора case, которого мне не хватает?

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

В стандартном SQL это не должно возвращать никаких результатов (кроме ошибки):

sum(case when facilityname like '%AT%' then count(status) else 0 end) as AT_all_status

, поскольку функции агрегирования не могут быть вложенными.Oracle допускает их вложение, но я не рекомендую использовать эту функциональность - подзапрос достаточно прост.

В любом случае, я почти уверен, что вы действительно намереваетесь:

sum(case when facilityname like '%AT%' then 1 else 0 end) as AT_all_status
1 голос
/ 04 июня 2019

Другой способ перевести ваш запрос, используя только одну агрегатную функцию и не вкладывать его, заключается в следующем:

count(case when facilityname like '%AT%' then status end)
...