PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Nombre de SQL conditionnel

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