Postgres Count с разными условиями в одном запросе

38

РЕДАКТИРОВАТЬ Postgres 9,3

Я работаю над отчетом, который имеет следующую схему: http://sqlfiddle.com/#!15/fd104/2

Текущий запрос работает нормально, который выглядит так:

введите описание изображения здесь

По сути, это внутреннее соединение с тремя таблицами. Я не сделал этот запрос, но разработчик, который оставил его, и я хочу изменить запрос. Как видите, TotalApplicationпросто подсчитывает общее количество заявок на основе a.agent_id. И вы можете увидеть totalapplicationстолбец в результате. То, что я хочу, это удалить это и изменить на totalapplicationдва новых столбца. Я хочу добавить completedsurveyи partitalsurveyстолбец. Так что в основном эта часть станет

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

Я только что добавил, AND disposition = 'Completed Survey'но мне нужен еще один столбец, для partialsurveyкоторого есть тот же запрос, с completedsurveyтой лишь разницей

AND disposition = 'Partial Survey'

а также

COUNT(a.id) as PartialSurvey

Но я не знаю, где поставить этот запрос или как будет выглядеть запрос. Так что окончательный результат имеет эти столбцы

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

Как только все в порядке, тогда applicationperhour и rph я могу исправить это сам

jackhammer013
источник

Ответы:

75

Если я вас правильно понимаю, вы ищете отфильтрованный (условный) агрегат:

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;

Отредактируйте
для более старых версий (<9.4), вам нужно использовать caseоператор:

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;
a_horse_with_no_name
источник
Я использую 9.3. Это нормально?
jackhammer013
@JoeneFloresca: нет, для 9.3 вам нужно CASEзаявление. Вы всегда должны указывать версию, которую вы используете, особенно если она не является текущей.
a_horse_with_no_name
Большое спасибо! работает отлично сейчас. Извините, отредактировал мой пост и учту это в следующий раз. Спасибо :)
jackhammer013
Ссылка на документы на FILTER: postgresql.org/docs/current/static/…
bcattle
Полезно для меня (/)
Саджив