Postgres Count mit unterschiedlichen Bedingungen für dieselbe Abfrage

38

EDIT Postgres 9.3

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

Die aktuelle Abfrage funktioniert einwandfrei. Sie sieht folgendermaßen aus:

Bildbeschreibung hier eingeben

Grundsätzlich ist es ein 3-Tabellen-Inner-Join. Ich habe diese Abfrage nicht durchgeführt, aber der Entwickler, der sie verlassen hat, und ich möchte die Abfrage ändern. Wie Sie sehen können, TotalApplicationzählt nur die Gesamtanwendung auf der Grundlage der a.agent_id. Und Sie können die totalapplicationSpalte im Ergebnis sehen. Was ich möchte, ist, das zu entfernen und das totalapplicationzu einer neuen Spalte zwei zu ändern . Ich möchte eine completedsurveyund partitalsurveySpalte 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 hinzugefügt, AND disposition = 'Completed Survey'aber ich brauche eine andere Spalte, für partialsurveydie die gleiche Abfrage mit completedsurveydem einzigen Unterschied besteht

AND disposition = 'Partial Survey'

und

COUNT(a.id) as PartialSurvey

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

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

Sobald es in Ordnung ist, kann ich es selbst beheben

jackhammer013
quelle

Antworten:

75

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 Sie
für ältere Versionen (<9.4) eine caseAnweisung:

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;
ein Pferd ohne Name
quelle
Ich benutze 9.3. Ist es o.k?
jackhammer013
@JoeneFloresca: nein, für 9.3 brauchst du a CASE . Sie sollten immer die Version angeben, die Sie verwenden, insbesondere wenn es sich nicht um die aktuelle handelt.
a_horse_with_no_name
Vielen Dank! funktioniert jetzt perfekt. Tut mir leid, habe meinen Beitrag bearbeitet und werde dies beim nächsten Mal berücksichtigen. Danke :)
jackhammer013
Link zu Dokumenten über FILTER: postgresql.org/docs/current/static/…
bcattle
Nützlich für mich (/)
Sajeev