Dans Postgres 9.4 ou version ultérieure, utilisez l'agrégat FILTER
option. Généralement le plus propre et le plus rapide :
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;
Détails pour le FILTER
clause :
- Colonnes agrégées avec des filtres supplémentaires (distincts)
Si vous le voulez court :
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;
Plus de variantes de syntaxe :
- Pour des performances absolues, SUM est-il plus rapide ou COUNT ?
Requête croisée appropriée
crosstab()
donne les meilleures performances et est plus court pour les longues listes d'options :
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);
Explication détaillée :
- Requête croisée PostgreSQL