Группа Postgresql по отображению всех элементов, даже нулевых

#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