web-dev-qa-db-fra.com

Nombre de postgres avec condition différente sur la même requête

[~ # ~] modifier [~ # ~] Postgres 9.3

Je travaille sur un rapport qui a le schéma suivant: http://sqlfiddle.com/#!15/fd104/2

La requête actuelle fonctionne très bien et ressemble à ceci:

enter image description here

Fondamentalement, il s'agit d'une jointure interne à 3 tables. Je n'ai pas fait cette requête mais le développeur qui l'a laissée et je souhaite modifier la requête. Comme vous pouvez le voir, TotalApplication compte simplement l’application totale en fonction du a.agent_id. Et vous pouvez voir la colonne totalapplication dans le résultat. Ce que je veux, c'est supprimer cela et changer le totalapplication en deux nouvelles colonnes. Je veux ajouter une colonne completedsurvey et partitalsurvey. Donc, fondamentalement, cette partie deviendra

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

Je viens d'ajouter AND disposition = 'Completed Survey' Mais j'ai besoin d'une autre colonne pour partialsurvey qui a la même requête avec completedsurvey étant la seule différence est

AND disposition = 'Partial Survey'

et

COUNT(a.id) as PartialSurvey

Mais je ne sais pas où placer cette requête ni à quoi ressemblera la requête. La sortie finale contient donc ces colonnes

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

Une fois que tout va bien, puis l'application et l'heure et je peux le réparer moi-même

45
jackhammer013

Si je vous comprends bien, vous recherchez un agrégat filtré (conditionnel):

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;

Modifier
pour les anciennes versions (<9.4), vous devez utiliser une instruction case:

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