Суммирование значений для одних и тех же дат в postgresql

#sql #postgresql

#sql #postgresql

Вопрос:

Приведенный ниже запрос предоставляет результат на изображении, однако я хочу суммировать новые слова и выполненные заказы для одних и тех же дат.Я уже получаю данные за последние 7 дней.

 SELECT DATE(pickup_date),
COUNT(CASE WHEN order_status ='New' THEN 1 END) AS "NewOrders",
COUNT(CASE WHEN order_status ='Done' THEN 1 END) AS "DoneOrders" 
from requests where DATE(pickup_date) > current_date::date - INTERVAL '7 days' GROUP BY pickup_date 
ORDER BY pickup_date;
  

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

Ответ №1:

Вам нужно исправить GROUP BY . Ваш ключ агрегации — это дата со временем. Вы хотите преобразовать значение в дату:

 SELECT pickup_date::date, 
       COUNT(CASE WHEN order_status ='New' THEN 1 END) AS "NewOrders",
       COUNT(CASE WHEN order_status ='Done' THEN 1 END) AS "DoneOrders" 
FROM requests 
WHERE pickup_date::date > current_date- INTERVAL '7 days'
GROUP BY pickup_date::date
ORDER BY pickup_date::date;
  

Postgres также поддерживает FILTER , что является более чистым способом написания логики. Кроме того, current_date это дата, поэтому ее не нужно преобразовывать, и двойные кавычки не нужны, поэтому не используйте их!

 SELECT pickup_date::date, 
       COUNT(*) FILTER (WHERE order_status = 'New') AS NewOrders,
       COUNT(*) FILTER (WHERE order_status = 'Done') AS DoneOrders
FROM requests 
WHERE pickup_date::date > current_date - INTERVAL '7 days'
GROUP BY pickup_date::date
ORDER BY pickup_date::date;
  

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

1. У меня есть другой столбец price, но для этого я должен проверить, когда order_status = «Выполнено», я хочу добавить к нему этот подзапрос, выберите sum (цена), где order_status = «Выполнено», для того же запроса

2. Вы можете написать это, как sum(price) filter (where order_status='Done') as PriceSum в приведенном выше запросе.