#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
этого должно хватить