Contagem do Postgres com condições diferentes na mesma consulta

38

EDIT Postgres 9.3

Estou trabalhando em um relatório que possui o seguinte esquema: http://sqlfiddle.com/#!15/fd104/2

A consulta atual está funcionando bem, assim:

insira a descrição da imagem aqui

Basicamente, é uma junção interna de 3 tabelas. Eu não fiz essa consulta, mas o desenvolvedor que a deixou e quero modificar a consulta. Como você pode ver, TotalApplicationapenas conta o total de aplicativos com base no a.agent_id. E você pode ver a totalapplicationcoluna no resultado. O que eu quero é remover isso e mudar totalapplicationpara uma nova coluna duas. Eu quero adicionar uma coluna completedsurveye partitalsurvey. Então, basicamente, essa parte se tornará

SELECT a.agent_id as agent_id, COUNT(a.id) as CompletedSurvey
FROM forms a WHERE  a.created_at >= '2015-08-01' AND 
a.created_at <= '2015-08-31' AND disposition = 'Completed Survey'
GROUP BY a.agent_id

Acabei de adicionar AND disposition = 'Completed Survey'Mas preciso de outra coluna para a partialsurveyqual a mesma consulta completedsurveyseja a única diferença.

AND disposition = 'Partial Survey'

e

COUNT(a.id) as PartialSurvey

Mas não sei onde colocar essa consulta ou como será a consulta. Portanto, a saída final tem essas colunas

agent_id, name, completedsurvey, partialsurvey, loginhours, applicationperhour, rph

Quando estiver ok, então applicationperhour e rph eu mesmo posso consertar

jackhammer013
fonte

Respostas:

75

Se entendi corretamente, você está procurando um agregado filtrado (condicional):

SELECT a.agent_id as agent_id, 
       COUNT(a.id) filter (where disposition = 'Completed Survey') as CompletedSurvey, 
       count(a.id) filter (where disposition = 'Partial Survey') as partial_survey
FROM forms a 
WHERE a.created_at >= '2015-08-01' 
  AND a.created_at <= '2015-08-31' 
GROUP BY a.agent_id;

Edite
para versões mais antigas (<9.4), você precisa usar uma caseinstrução:

SELECT a.agent_id as agent_id, 
       COUNT(case when disposition = 'Completed Survey' then a.id end) as CompletedSurvey, 
       COUNT(case when disposition = 'Partial Survey' then a.id end) as partial_survey
FROM forms a 
WHERE a.created_at >= '2015-08-01' 
  AND a.created_at <= '2015-08-31' 
GROUP BY a.agent_id;
um cavalo sem nome
fonte
Estou usando 9.3. Tudo bem?
precisa saber é o seguinte
@JoeneFloresca: não, para 9.3 você precisa de uma CASEdeclaração. Você sempre deve especificar a versão que está usando, especialmente se não for a atual.
A_horse_with_no_name
Muito obrigado! funciona perfeito agora. Desculpe por isso, editei meu post e lembre-se disso na próxima vez. Obrigado :)
jackhammer013
Link para documentos em FILTER: postgresql.org/docs/current/static/…
bcattle
Útil para mim (/)
Sajeev 23/07