it-swarm.com.de

Postgres Count mit unterschiedlichen Bedingungen für dieselbe Abfrage

[~ # ~] edit [~ # ~] Postgres 9.3

Ich arbeite an einem Bericht mit folgendem Schema: http://sqlfiddle.com/#!15/fd104/2

Die aktuelle Abfrage funktioniert einwandfrei und sieht folgendermaßen aus:

(enter image description here

Grundsätzlich handelt es sich um eine innere Verknüpfung mit 3 Tabellen. Ich habe diese Abfrage nicht durchgeführt, sondern den Entwickler, der sie verlassen hat, und ich möchte die Abfrage ändern. Wie Sie sehen können, zählt TotalApplication nur die gesamte Anwendung basierend auf a.agent_id. Und Sie können die Spalte totalapplication im Ergebnis sehen. Ich möchte das entfernen und totalapplication in eine neue zweispaltige Spalte ändern. Ich möchte eine Spalte completedsurvey und partitalsurvey hinzufügen. Also im Grunde wird dieser Teil werden

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

Ich habe gerade AND disposition = 'Completed Survey' Aber ich brauche eine andere Spalte für partialsurvey, die dieselbe Abfrage hat, wobei completedsurvey der einzige Unterschied ist

AND disposition = 'Partial Survey'

und

COUNT(a.id) as PartialSurvey

Aber ich weiß nicht, wo diese Abfrage abgelegt werden soll oder wie die Abfrage aussehen wird. Die endgültige Ausgabe enthält also diese Spalten

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

Sobald es in Ordnung ist, kann ich es selbst reparieren

45
jackhammer013

Wenn ich Sie richtig verstehe, suchen Sie nach einem gefilterten (bedingten) Aggregat:

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;

Bearbeiten
Für ältere Versionen (<9.4) müssen Sie eine case Anweisung verwenden:

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