Показать ноль в строковом сгруппированном значении - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь отфильтровать таблицу sql примерно так:

| status     | name   | description       |  
|------------|--------|-------------------|  
| finished   | task 1 | finished task 1   |  
| finished   | task 2 | finished task 2   |  
| in_process | task 3 | in process task 1 |  

, но столбец состояния может иметь 3 различных значения: finished, in_process и new. проблема: некоторые значения могут не иметь записей, поэтому как мне сгруппировать запрос со всеми возможными значениями статуса?

Мой текущий запрос:

select status, count(status)
from tasks
group by status

1 Ответ

2 голосов
/ 12 апреля 2020

Один из вариантов - перечислить все возможные значения состояния, а затем привести таблицу с 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
...