#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
в приведенном выше запросе.