2013-10-12 18 views
5

Io di solito eseguire le seguenti query SQL in PostgreSQL 9.1 in modo sequenziale tramite psycopg2 ogni paio di secondi:PostgreSQL multipla count() dove le condizioni di una singola query

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'; 

E 'possibile fare la stessa cosa in un unico seleziona query in modo tale da ottenere un conteggio per ogni tipo anche se il conteggio è zero. Quanto segue funzionerebbe se mi assegnasse lo zero conteggi quando ci sono zero per un dato tipo.

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

Grazie,

risposta

4

Usa tabella derivata come ancoraggio della query:

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

Ho lanciato un ordine per tipo alla fine ed è esattamente quello che voglio. Grazie. – user2695222

1

ci possono essere molte soluzioni possibili per questo. Uno è generando tutto il tipo desiderato in una sottoquery utilizzando UNION ALL e facendo un LEFT JOIN nella tabella bag. In questo caso, tutti gli types che si desidera ottenere verranno visualizzati nell'elenco dei risultati e il tipo non esistente nella tabella bag avrà zero conteggio. Questo sarà quasi funziona su tutti RDBMS.

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

Apprezzare l'aiuto . Grazie – user2695222

Problemi correlati