Postgres Zliczaj z różnymi warunkami na tym samym zapytaniu

38

EDYCJA Postgres 9.3

Pracuję nad raportem, który ma następujący schemat: http://sqlfiddle.com/#!15/fd104/2

Bieżące zapytanie działa poprawnie i wygląda następująco:

wprowadź opis zdjęcia tutaj

Zasadniczo jest to wewnętrzne połączenie z 3 stołami. Nie wykonałem tego zapytania, ale programista, który go opuścił i chcę zmodyfikować zapytanie. Jak widać, TotalApplicationliczy się tylko całkowita aplikacja na podstawie a.agent_id. I możesz zobaczyć totalapplicationkolumnę w wyniku. Chcę to usunąć i zmienić na totalapplicationdwie nowe kolumny. Chcę dodać kolumnę completedsurveyi partitalsurvey. Więc w zasadzie ta część się stanie

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

Właśnie dodałem AND disposition = 'Completed Survey'Ale potrzebuję innej kolumny, dla partialsurveyktórej ma to samo zapytanie completedsurvey, a jedyna różnica to

AND disposition = 'Partial Survey'

i

COUNT(a.id) as PartialSurvey

Ale nie wiem, gdzie umieścić to zapytanie ani jak będzie wyglądać zapytanie, więc końcowe dane wyjściowe mają te kolumny

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

Gdy wszystko będzie w porządku, aplikuj godzinę i rph, mogę to naprawić samodzielnie

jackhammer013
źródło

Odpowiedzi:

75

Jeśli dobrze cię rozumiem, szukasz odfiltrowanego (warunkowego) agregatu:

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;

Edytuj
dla starszych wersji (<9.4), musisz użyć caseinstrukcji:

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;
koń bez imienia
źródło
Używam 9.3. Czy to jest w porządku?
jackhammer013,
@JoeneFloresca: nie, do 9.3 potrzebujesz CASEoświadczenia. Zawsze powinieneś określać wersję, której używasz, zwłaszcza jeśli nie jest to bieżąca.
a_horse_w_no_name
Wielkie dzięki! działa teraz idealnie. Przepraszamy, zredagowałem mój post i będę o tym pamiętać następnym razem. Dzięki :)
jackhammer013
Link do dokumentacji na FILTER: postgresql.org/docs/current/static/…
bcattle
Przydatne dla mnie (/)
Sajeev