2013-10-12 4 views
5

Я обычно выполнить следующие SQL запросов в PostgreSQL 9.1 последовательно через psycopg2 каждые несколько секунд:PostgreSQL многократный подсчет(), где условия в одном запросе

select count(type) from bag where type= 'fruit'; 
select count(type) from bag where type= 'vegtable'; 
select count(type) from bag where type= 'other'; 
select count(type) from bag where type= 'misc'; 

Можно ли сделать то же самое в одном выберите запрос, чтобы получить счетчик для каждого типа, даже если этот счет равен нулю. Следующее будет работать, если бы оно дало мне нулевые значения, когда для данного типа есть нуль.

select type, count(*) from bag group by type; 

Спасибо,

ответ

4

Используйте полученную таблицу в качестве якоря запроса:

select a.type, count(b.type) 
from (values ('fruit'), ('vegtable'), ('other'), ('misc')) as a(type) 
    left outer join bag as b on b.type = a.type 
group by a.type 

sql fiddle demo

+0

Я бросил заказ по типу в конце, и это именно то, что я хочу. Спасибо. – user2695222

1

Там может быть много возможных решений для этого. Один из них является генерацией всего желаемого типа в подзапросе с использованием UNION ALL и делает LEFT JOIN против таблицы bag. В этом случае все types, которые вы хотите получить, будут показаны в списке результатов, а несуществующий тип в таблице bag будет иметь нулевой счет. Это будет почти работает на всех РСУБД.

SELECT a.type, 
     COUNT(b.type) TotalCount 
FROM 
     (
      SELECT 'fruit' AS type UNION ALL 
      SELECT 'vegtable' AS type UNION ALL 
      SELECT 'other' AS type UNION ALL 
      SELECT 'misc' AS type 
     ) AS a 
     LEFT JOIN bag AS b 
      ON a.type = b.type 
GROUP By a.type 
+0

Цените помощь , Спасибо – user2695222

Смежные вопросы