PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Bedingte SQL-Anzahl

Verwenden Sie in Postgres 9.4 oder höher das Aggregat FILTER Möglichkeit. Typischerweise am saubersten und schnellsten:

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;

Details für den FILTER Klausel:

  • Aggregierte Spalten mit zusätzlichen (unterschiedlichen) Filtern

Wenn Sie es kurz wollen :

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;

Weitere Syntaxvarianten:

  • Ist für die absolute Leistung SUM schneller oder COUNT?

Korrekte Kreuztabellenabfrage

crosstab() liefert die beste Leistung und ist kürzer für lange Optionslisten:

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);

Ausführliche Erklärung:

  • PostgreSQL-Kreuztabellenabfrage