Postgres Conta con condizioni diverse sulla stessa query


38

EDIT Postgres 9.3

Sto lavorando a un rapporto che ha questo schema seguente: http://sqlfiddle.com/#!15/fd104/2

La query corrente funziona correttamente, che assomiglia a questo:

inserisci qui la descrizione dell'immagine

Fondamentalmente si tratta di un join interno di 3 tabelle. Non ho fatto questa query ma lo sviluppatore che l'ha lasciata e voglio modificare la query. Come puoi vedere, TotalApplicationconta solo l'applicazione totale in base al a.agent_id. E puoi vedere la totalapplicationcolonna nel risultato. Quello che voglio è rimuoverlo e cambiarlo totalapplicationin una nuova due colonne. Voglio aggiungere una completedsurveye partitalsurveycolonna. Quindi sostanzialmente questa parte diventerà

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

Ho appena aggiunto AND disposition = 'Completed Survey'Ma ho bisogno di un'altra colonna per la partialsurveyquale ha la stessa query con completedsurveyl'unica differenza

AND disposition = 'Partial Survey'

e

COUNT(a.id) as PartialSurvey

Ma non so dove mettere quella query o come sarà la query. Quindi l'output finale ha queste colonne

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

Una volta che è ok, allora applicationforhour e rph posso ripararlo da solo

Risposte:


75

Se ti capisco correttamente, stai cercando un aggregato filtrato (condizionale):

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;

Modifica
per le versioni precedenti (<9.4) è necessario utilizzare caseun'istruzione:

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;

Sto usando 9.3. Va bene?
jackhammer013,

@JoeneFloresca: no, per 9.3 hai bisogno di una CASEdichiarazione. Devi sempre specificare la versione che stai utilizzando, soprattutto se non è quella corrente.
a_horse_with_no_name

Grazie tante! funziona perfettamente ora. Mi dispiace, ho modificato il mio post e lo terrò a mente la prossima volta. Grazie :)
jackhammer013

Link ai documenti su FILTER: postgresql.org/docs/current/static/…
bcattle

Utile per me (/)
Sajeev il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.