PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Contagem SQL condicional


No Postgres 9.4 ou posterior, use o agregado FILTER opção. Normalmente mais limpo e mais 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;

Detalhes para o FILTER cláusula:
  • Colunas agregadas com filtros adicionais (distintos)

Se você quiser curto :
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;

Mais variantes de sintaxe:
  • Para desempenho absoluto, SUM é mais rápido ou COUNT?

Consulta de referência cruzada adequada


crosstab() produz o melhor desempenho e é mais curto para longas listas de opções:
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);

Explicação detalhada:
  • Consulta de tabela cruzada PostgreSQL