Один из вариантов - перечислить все возможные значения состояния, а затем привести таблицу с left join
.
Например:
select s.status, count(t.status) no_status
from (
select 'finished' status
union all select 'in_process'
union all select 'new'
) s
left join mytable t on t.status = s.status
group by s.status
В некоторых базах данных есть более удобный способ объявления производных таблица состояния, например, конструктор таблицы values()
:
select s.status, count(t.status) no_status
from (values ('finished'), ('in_process'), ('new')) s(status)
left join mytable t on t.status = s.status
group by s.status
Вы также можете использовать select distinct
для получения значений непосредственно из таблицы (хотя это менее эффективно, поскольку для этого требуется дополнительное сканирование исходная таблица и дедупликация):
select s.status, count(t.status) no_status
from (select distinct status from mytable) s
left join mytable t on t.status = s.status
group by s.status
В идеальной ситуации у вас была бы справочная таблица для хранения всех возможных значений состояния, скажем statuses(status)
:
select s.status, count(t.status) no_status
from statuses s
left join mytable t on t.status = s.status
group by s.status