PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Conteggio SQL condizionale

In Postgres 9.4 o versioni successive, utilizza l'aggregato FILTER opzione. Tipicamente il più pulito e veloce:

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;

Dettagli per il FILTER clausola:

  • Colonna aggregata con filtri (distinti) aggiuntivi

Se lo vuoi breve :

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;

Altre varianti di sintassi:

  • Per prestazioni assolute, SUM è più veloce o COUNT?

Query corretta a campi incrociati

crosstab() produce le migliori prestazioni ed è più breve per lunghi elenchi di opzioni:

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

Spiegazione dettagliata:

  • Query a campi incrociati PostgreSQL