In Postgres 9.4 o versioni successive, utilizza l'aggregato FILTER
opzione. Tipicamente il più pulito e veloce:
SELECT category
, count(*) FILTER (WHERE question1 = 0) AS zero
, count(*) FILTER (WHERE question1 = 1) AS one
, count(*) FILTER (WHERE question1 = 2) AS two
FROM reviews
GROUP BY 1;
Dettagli per il FILTER
clausola:
- Colonna aggregata con filtri (distinti) aggiuntivi
Se lo vuoi breve :
SELECT category
, count(question1 = 0 OR NULL) AS zero
, count(question1 = 1 OR NULL) AS one
, count(question1 = 2 OR NULL) AS two
FROM reviews
GROUP BY 1;
Altre varianti di sintassi:
- Per prestazioni assolute, SUM è più veloce o COUNT?
Query corretta a campi incrociati
crosstab()
produce le migliori prestazioni ed è più breve per lunghi elenchi di opzioni:
SELECT * FROM crosstab(
'SELECT category, question1, count(*) AS ct
FROM reviews
GROUP BY 1, 2
ORDER BY 1, 2'
, 'VALUES (0), (1), (2)'
) AS ct (category text, zero int, one int, two int);
Spiegazione dettagliata:
- Query a campi incrociati PostgreSQL