Postgres Розраховується з різними умовами в одному запиті


38

EDIT Postgres 9.3

Я працюю над звітом, який має таку схему: http://sqlfiddle.com/#!15/fd104/2

Поточний запит працює нормально, виглядає так:

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

В основному це внутрішнє з'єднання 3 таблиці. Я не робив цей запит, але розробник, який його залишив, і хочу змінити запит. Як бачимо, 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, я можу сам це виправити

Відповіді:


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;

Я використовую 9.3. Це нормально?
jackhammer013

@JoeneFloresca: ні, для 9.3 вам потрібна CASEзаява. Ви завжди повинні вказувати версію, яку ви використовуєте, особливо якщо це не поточна версія.
a_horse_with_no_name

Дуже дякую! працює ідеально зараз. Вибачте за це, відредагував мою публікацію і пам’ятайте про це наступного разу. Дякую :)
jackhammer013

Посилання на документи на FILTER: postgresql.org/docs/current/static/…
bcattle

Корисний для мене (/)
Саєєв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.