SQL - объединенная группа по - PullRequest
0 голосов
/ 10 апреля 2020

Пытаюсь выяснить, как объединить эти два запроса, но борюсь с этим.

1.

select ia.name, count(archived_i) from (
    select * from incident i
    where i.archived = true
) as archived_i
right join incident_action ia on archived_i.incident_action_id = ia.id
group by ia.name
order by ia.name;

дает

Detention   3
Expulsion   0
Warning     2

2.

select in_s.name, count(archived_i) from (
    select * from incident i
    where i.archived = true
) as archived_i
right join incident_severity as in_s on archived_i.incident_severity_id = in_s.id
group by in_s.name
order by in_s.name;

приводит к

High    0
Low     5

Я хочу объединить их, чтобы сформировать что-то, что приводит к

Detention   High   0
Detention   Low    3
Expulsion   High   0
Expulsion   Low    0
Warning     High   0
Warning     Low    2

Каков будет правильный, эффективный способ сделать это?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Вы можете cross join серьезность и действие ссылочных таблиц, чтобы сгенерировать все возможные комбинации, а затем привести таблицу инцидентов с left join. Последний шаг - агрегация.

select ina.name action, ins.name severity, count(i.archived_i)
from incident_severity ins
cross join incident_action ina
left join incident i 
    on  i.incident_action_id = ina.id
    and i.incident_severity_id = ins.id
    and i.archived
group by ina.name, ins.name
0 голосов
/ 10 апреля 2020

Не изменяя свои запросы, вы можете сделать перекрестное соединение. Например:

select
  x.name,
  y.name,
  'x'
from (
  select ia.name, count(archived_i) from (
    select * from incident i
    where i.archived = true
  ) as archived_i
  right join incident_action ia on archived_i.incident_action_id = ia.id
  group by ia.name
  order by ia.name
) x
cross join (
  select in_s.name, count(archived_i) from (
    select * from incident i
    where i.archived = true
  ) as archived_i
  right join incident_severity as in_s 
    on archived_i.incident_severity_id = in_s.id
  group by in_s.name
  order by in_s.name
) y
...