Postgres Count con diferentes condiciones en la misma consulta

38

EDITAR Postgres 9.3

Estoy trabajando en un informe que tiene el siguiente esquema: http://sqlfiddle.com/#!15/fd104/2

La consulta actual funciona bien y tiene este aspecto:

ingrese la descripción de la imagen aquí

Básicamente es una unión interna de 3 mesas. No hice esta consulta pero el desarrollador que la dejó y quiero modificar la consulta. Como puede ver, TotalApplicationsolo cuenta la aplicación total según el a.agent_id. Y puedes ver la totalapplicationcolumna en el resultado. Lo que quiero es eliminar eso y cambiarlo totalapplicationa una nueva columna dos. Quiero agregar una completedsurveyy partitalsurveycolumna. Entonces, básicamente, esta parte se convertirá

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

Acabo de agregar AND disposition = 'Completed Survey'Pero necesito otra columna para la partialsurveyque tenga la misma consulta con completedsurveyla única diferencia es

AND disposition = 'Partial Survey'

y

COUNT(a.id) as PartialSurvey

Pero no sé dónde colocar esa consulta o cómo será la consulta, por lo que el resultado final tiene estas columnas

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

Una vez que esté bien, entonces la aplicación por hora y rph puedo arreglarlo yo mismo

jackhammer013
fuente

Respuestas:

75

Si te entiendo correctamente, estás buscando un agregado filtrado (condicional):

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;

Edite
para versiones anteriores (<9.4) necesita usar una casedeclaración:

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;
un caballo sin nombre
fuente
Estoy usando 9.3. ¿Está bien?
jackhammer013
@JoeneFloresca: no, para 9.3 necesitas una CASEdeclaración. Siempre debe especificar la versión que está utilizando, especialmente si no es la actual.
a_horse_with_no_name
¡Muchas gracias! funciona perfecto ahora. Lo siento, edité mi publicación y lo tendré en cuenta la próxima vez. Gracias :)
jackhammer013
Enlace a documentos en FILTER: postgresql.org/docs/current/static/…
bcattle
Útil para mí (/)
Sajeev