Инструкция GROUP BY CASE с postgresql

#sql #postgresql #group-by

Вопрос:

Я пытаюсь сгруппироваться по инструкции CASE с помощью postgresql, но у меня возникает ошибка «агрегатные функции не разрешены в GROUP BY».

 with zones as (  select school,  region,  dt  from district  where dt between '1-jan-2021' and '31-jan-2021' ) select c.region,  to_char(a.dt, 'yyyy-mm') mth,  case  when sum(a.payment) = 0 then '0'  else '1'  end as seg,  sum(a.records) records1,  sum(a.amount) payment from budget a  left join zones c on a.school = c.school  and a.dt = c.dt where a.dt between '1-jan-2021' and '31-jan-2021' group by c.region,  to_char(a.dt, 'yyyy-mm'),  seg order by c.site,  to_char(a.dt, 'yyyy-mm'),  seg;  

Заранее спасибо

Комментарии:

1. на первый взгляд, все должно быть в порядке без сега в группе?

2. Правильно отформатированный SQL намного легче читать и писать.

Ответ №1:

Результатом group by могут быть только выражения с атрибутами в группе (и атрибуты, которые функционально зависят от атрибутов в группе by) и функции агрегирования (пармы для этих функций могут быть любыми атрибутами). Я подозреваю, что вы можете переписать свой запрос таким образом, чтобы конечной функцией была сумма (переместите регистр внутри суммы). Но…

Поскольку «случай» находится в окончательной проекции, вы можете сначала выполнить групповую проекцию, а затем выполнить другую проекцию.

Сделайте это (убедитесь, что вы даете имена каждому атрибуту, который вычисляется с помощью суммы, например sumpayment).:

 WITH t as (-- original query with case removed  SELECT ..., sum(a.payment) as sumpayment,   ...) select ..., case when sumpayment=0 then '0' else '1' end as seg,   ... -- any other attribute from T  

этого должно хватить