PostgreSQL - Как отобразить счетчик = 0 в этом запросе? - PullRequest
4 голосов
/ 17 июля 2011

shelter_inventory (таблица)

gid | pav_type | yes
 1  |  1       | 1
 2  |  1       | 1
 3  |  0       | 1
 4  |  2       | 1 
 5  |  2       | 0

это текущий запрос ( не отображает счетчик = 0 )

SELECT pav_type, count(*) FROM shelter_inventory 
WHERE yes = 1 GROUP BY pav_type ORDER BY pav_type

и я хочу, чтобы результат былотобразить как это

pav_type | count(*)
 0       |  1
 1       |  2
 2       |  1 
 3       |  0

Как я могу запросить в этом случае?Я использую PostgreSQL.

Ответы [ 3 ]

4 голосов
/ 17 июля 2011

Если ваши 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.

0 голосов
/ 17 июля 2011

Используйте SUM(CASE WHEN yes=1 THEN 1 ELSE 0 END), вы также можете включить GROUP BY pav_type HAVING SUM(CASE WHEN yes=1 THEN 1 ELSE 0 END) = 0

0 голосов
/ 17 июля 2011

Вам нужна отдельная таблица с всеми значениями pav_type, назовем ее pav_type_ref. Тогда внешнее соединение от него.

create table pav_type_ref (pav_type int);
insert into pav_type_ref values (1), (2), (3);

SELECT r.pav_type, sum(case when i.pav_type is null then 0 else 1 end)
FROM pav_type_ref r
left join shelter_inventory i on i.pav_type = r.pav_type
WHERE yes = 1
GROUP BY 1
ORDER BY 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...