No Postgres 9.4 ou posterior, use o agregado
FILTER
opção. Normalmente mais limpo e mais rápido: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;
Detalhes para o
FILTER
cláusula:- Colunas agregadas com filtros adicionais (distintos)
Se você quiser curto :
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;
Mais variantes de sintaxe:
- Para desempenho absoluto, SUM é mais rápido ou COUNT?
Consulta de referência cruzada adequada
crosstab()
produz o melhor desempenho e é mais curto para longas listas de opções: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);
Explicação detalhada:
- Consulta de tabela cruzada PostgreSQL