sql >> Base de Datos >  >> RDS >> PostgreSQL

Recuento de SQL condicional

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