Считать с группой на Postgresql - PullRequest
1 голос
/ 26 мая 2019

У меня есть тип postgresql и таблица

CREATE TYPE mem_status AS ENUM('waiting', 'active', 'expired');

CREATE TABLE mems (
  id BIGSERIAL PRIMARY KEY,
  status mem_status NOT NULL
);

набор данных

INSERT INTO mems(id, status) VALUES
  (1, 'active'), (2, 'active'), (3, 'expired');

Я хочу запросить счетчики, сгруппированные по статусам.Итак, я обработал запрос ниже.

WITH mem_statuses AS (
  SELECT unnest(enum_range(NULL::mem_status)) AS status
)
SELECT m.status, count(1)
  FROM mems m
  RIGHT JOIN mem_statuses ms ON ms.status = m.status
  GROUP BY m.status;

Но если нет waiting мемов, результат будет выглядеть следующим образом.

status     |  count  
================
NULL       |  1      <- problem
'active'   |  2
'expired'  |  1

Я хочу получить такой результат.

status     |  count  
================
'waiting'  |  0
'active'   |  2
'expired'  |  1

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Вам нужно изменить объединение и немного агрегировать -

select ms.status, count(m.status)
from (select unnest(enum_range(null::mem_status))) as ms(status)
left join mems as m
  on ms.status = m.status
group by ms.status;
0 голосов
/ 27 мая 2019

Использование count(id):

WITH mem_statuses AS (
  SELECT unnest(enum_range(NULL::mem_status)) AS status
)
SELECT ms.status, count(id)
  FROM mems m
  RIGHT JOIN mem_statuses ms ON ms.status = m.status
  GROUP BY ms.status;

или:

select status, count(id)
from unnest(enum_range(null::mem_status)) as status
left join mems using(status)
group by status


 status  | count 
---------+-------
 waiting |     0
 active  |     2
 expired |     1
(3 rows)

За документация count(expression) дает

количество входных строк, для которых значение выражения не равно нулю

...