Если ваши pav_type
значения являются последовательными, тогда вы можете использовать generate_series
вместо внешней таблицы:
select p.pav_type, count(yes)
from generate_series(0,3) as p(pav_type)
left outer join shelter_inventory s
on p.pav_type = s.pav_type and s.yes = 1
group by p.pav_type
order by p.pav_type
Это дает:
pav_type | count
----------+-------
0 | 1
1 | 2
2 | 1
3 | 0
Это:
generate_series(0,3) as p(pav_type)
по сути генерирует встроенную таблицу с одним столбцом с именем pav_type
и четырьмя строками: 0, 1, 2, 3. И вам нужно иметь s.yes = 1
в условии соединения (а не WHERE), потому что вы хотите значения yes = 0
должны быть в предварительно сгруппированном наборе результатов; если в предложении WHERE указано s.yes = 1
, то строки yes = 0
не будут учитываться независимо от условия соединения.
Если ваш pav_types
не очень подходит для generate_series
(т.е. не последовательный или последовательный шаг), и у вас их только небольшое количество, вы можете присоединиться к выражению VALUES :
select p.pav_type, count(yes)
from (values (0), (1), (2), (3)) as p(pav_type)
left outer join shelter_inventory s
on p.pav_type = s.pav_type and s.yes = 1
group by p.pav_type
order by p.pav_type
Вы, конечно же, должны убедиться, что все скобки в правильных местах.
Если у вас есть pav_types
в отдельной таблице, тогда выполните левое внешнее соединение с этой таблицей вместо использования generate_series
. Если ваш pav_types
не является последовательным, и у вас есть слишком много, чтобы разумно вставить выражение VALUES, тогда создайте таблицу, в которой будут храниться действительные значения pav_type
и LEFT OUTER JOIN.