En Postgres 9.4 o posterior, use el agregado FILTER
opción. Por lo general, el más limpio y 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;
Detalles para el FILTER
cláusula:
- Columnas agregadas con filtros adicionales (distintos)
Si lo quieres corto :
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;
Más variantes de sintaxis:
- Para un rendimiento absoluto, ¿SUM es más rápido o COUNT?
Consulta de tabulación cruzada adecuada
crosstab()
produce el mejor rendimiento y es más corto para largas listas de opciones:
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);
Explicación detallada:
- Consulta de tabulación cruzada de PostgreSQL