[~ # ~] 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:
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
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;