Postgres Count avec une condition différente sur la même requête

38

EDIT Postgres 9.3

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

La requête en cours fonctionne bien et ressemble à ceci:

entrez la description de l'image ici

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 constater, TotalApplicationle nombre total d’applications est calculé en fonction du a.agent_id. Et vous pouvez voir la totalapplicationcolonne dans le résultat. Ce que je veux, c'est enlever ça et changer le totalapplicationen une nouvelle deux colonnes. Je veux ajouter une colonne completedsurveyet 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 partialsurveylaquelle a la même requête, completedsurveyla seule différence étant

AND disposition = 'Partial Survey'

et

COUNT(a.id) as PartialSurvey

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

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

Une fois que c'est ok puis applicationperhour et rph je peux le réparer moi-même

jackhammer013
la source

Réponses:

75

Si je vous ai bien compris, 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;

Editer
pour les anciennes versions (<9.4), vous devez utiliser une casedéclaration:

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;
un cheval sans nom
la source
J'utilise 9.3. Est-ce que c'est bon?
jackhammer013
@JoeneFloresca: non, pour 9.3, vous avez besoin d'une CASEdéclaration. Vous devez toujours spécifier la version que vous utilisez, surtout si ce n'est pas la version actuelle.
a_horse_with_no_name
Merci beaucoup! fonctionne parfaitement maintenant. Désolé, édité mon post et gardera cela à l'esprit la prochaine fois. Merci :)
jackhammer013
Lien vers la documentation sur FILTER: postgresql.org/docs/current/static/…
bcattle
Utile pour moi (/)
Sajeev