Contagem Postgres com condições diferentes na mesma consulta
-
29-09-2020 - |
Pergunta
EDITAR 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 e é assim:
Basicamente é uma junção interna de 3 tabelas.Não fui eu que fiz essa consulta e sim o desenvolvedor que a deixou e quero modificar a consulta.Como você pode ver, TotalApplication
apenas conta a aplicação total com base no a.agent_id
.E você pode ver o totalapplication
coluna no resultado.O que eu quero é remover isso e mudar o totalapplication
para uma nova coluna de duas.Eu quero adicionar um completedsurvey
e partitalsurvey
coluna.Então basicamente esta 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 partialsurvey
que tem a mesma consulta com completedsurvey
sendo 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 tudo bem, applicationperhour e rph eu posso consertar sozinho
Solução
Se bem entendi, 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;
Editar
para versões mais antigas (<9.4), você precisa usar um case
declaraçã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;