#sql #postgresql #sum #pivot #where-clause
#sql #postgresql #сумма #сводная #where-предложение
Вопрос:
У меня есть следующая таблица (продажи):
Запрос:
select product_id, sum(age)
FROM sales
WHERE age > 25
GROUP BY product_id
ORDER BY product_id
Фактический результат:
Я хочу показать все product_id в столбце. Если возраст <= 25, я хочу показать как 0. Например, product_id 1 будет отображаться как 0.
С наилучшими пожеланиями,
Ответ №1:
Вы можете выполнить условную агрегацию. Идея состоит в том, что вы не должны отфильтровывать строки в where
предложении (поскольку оно удаляет продукты, которые не имеют совпадений, прежде чем вы получите возможность их обработать); вместо этого вы можете переместить логику фильтрации в sum()
:
select product_id, coalesce(sum(age) filter(where age > 25), 0) sum_age
from sales
group by product_id
order by product_id
Ответ №2:
Вы можете использовать CASE
select product_id,(CASE WHEN sum(age)<=25 THEN 0 ELSE sum(age) END)
FROM sales
GROUP BY product_id
ORDER BY product_id