У меня есть одна таблица mysql следующей структуры. orders ( id, order_status(number), date(timestamp));
Дата обновляется при изменении статуса. Выберите счетчик всех заказов, используя order_status
. Но один order_status
говорит статус id 10, должен быть выбран на основе даты.
Пример: Рассмотрите статус id 10 означает, что заказ завершен. Выберите количество заказов со статусом 10, который обновляется сегодня. И все остальные показатели состояния рассчитываются без каких-либо условий.
count | s
------+---
2 | 1
6 | 2
8391 | 10
5 | 7
6 | 15
28 | 18
Изменив запрос, я добавил условие для даты:
select
sum(1) all_orders
, sum(case when order_status <> 10 then 1 else 0 end) as unclosed_orders
, sum(case when order_status = 10 AND date=DATE_FORMAT(NOW(),'%Y-%m-%d') then 1 else 0 end) as closed_orders_today
, sum(case when order_status = 10 AND date!=DATE_FORMAT(NOW(),'%Y-%m-%d')then 1 else 0 end) as closed_orders_past
from orders
Надеюсь это поможет!
РЕДАКТИРОВАТЬ
Союз двух запросов может получить желаемый результат:
SELECT COUNT(*) as count, order_status as s FROM orders WHERE order_status='10' AND date=DATE_FORMAT(NOW(),'%Y-%m-%d')
UNION
SELECT COUNT(*) as count, order_status as s FROM orders WHERE order_status!='10' GROUP BY order_status
1) Запрос возвращает счет со статусом 10 и размещается сегодня.
2) Запрос возвращает счетчик со статусом, отличным от 10.
Союз обоих возвращает счетчик и статус, чтобы получить желаемый результат.
Используйте " условные агрегаты ", которые являются case expressions
внутри aggregate function
например:
select count(*) all_orders , count(case when order_status 10 then id end) as unclosed_orders , count(case when order_status = 10 then id end) as closed_orders , count(case when order_status = 10 and last_updated_date = current_date() then id end) as closed_today from your_table
Примечание: функция COUNT()
игнорирует NULL
s
Вы можете имитировать тот же результат, используя SUM()
например:
select
sum(1) all_orders
, sum(case when order_status <> 10 then 1 else 0 end) as unclosed_orders
, sum(case when order_status = 10 then 1 else 0 end) as closed_orders
from your_table
Однако я предпочитаю использовать COUNT()
если это то, что представляют цифры.
COUNT(*)
также более эффективно (хотя разница может быть довольно небольшой).
s
) 10. Статус заказа 10 должна быть рассчитана на основе даты.