Как заставить множество возможных значений в условной агрегации? - PullRequest
0 голосов
/ 12 февраля 2020

В Oracle У меня есть запрос, который использует условное агрегирование для отображения итогов. См. http://sqlfiddle.com/#! 4 / ab1915 / 2

select ts.description,
sum(case when ta.group_number = 1 then 1 else 0 end) group_one
,sum(case when ta.group_number = 2 then 1 else 0 end) group_two
,sum(case when ta.group_number = 3 then 1 else 0 end) group_three
from ta 
join ts on ta.status_id=ts.status_id
group by ts.description;

Однако мне нужны результаты, чтобы показать еще одну строку для статуса «отменено», который в настоящее время не отображается, поскольку никаких записей с таким статусом нет, но мне все равно нужно отображать «отменено» с 0 счетами. Есть идеи, как мне это сделать?

DDL для этого примера:

create table ta (group_number number, status_id number);
create table ts (status_id number, description varchar(111));
insert into ta (group_number,status_id) values (1,1);
insert into ta (group_number,status_id) values (2,1);
insert into ta (group_number,status_id) values (3,2);
insert into ta (group_number,status_id) values (3,3);
insert into ta (group_number,status_id) values (3,3);

1 Ответ

1 голос
/ 12 февраля 2020

Используйте внешнее объединение, чтобы выбрать все значения ts, что означает необходимость изменить порядок таблиц в обратном порядке; и я бы использовал count() вместо sum():

select ts.description,
count(case when ta.group_number = 1 then 1 end) group_one
,count(case when ta.group_number = 2 then 1 end) group_two
,count(case when ta.group_number = 3 then 1 end) group_three
,count(case when ta.group_number = 4 then 1 end) group_four
from ts 
left join ta on ta.status_id=ts.status_id
group by ts.description;

DESCRIPTION           GROUP_ONE  GROUP_TWO GROUP_THREE
-------------------- ---------- ---------- -----------
started                       1          1           0
finished                      0          0           2
cancelled                     0          0           0
progressing                   0          0           1

Обновлено SQL Fiddle

Выражение case может соответствовать чему угодно при совпадении, это просто должно быть ненулевым. Из документов :

Если указать expr, тогда COUNT возвращает количество строк, где expr не является нулевым

, поэтому, когда регистр не соответствует, он оценивается как ноль, что не учитывается. (Вы можете иметь else null, если вы предпочитаете быть явным, но я предпочитаю краткость ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...