Применить условие с группой по

0

У меня есть одна таблица 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
Теги:

2 ответа

2

Изменив запрос, я добавил условие для даты:

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.

Союз обоих возвращает счетчик и статус, чтобы получить желаемый результат.

  • 0
    Спасибо, это здорово. Мне нужен вывод в том же формате, как указано в вопросе. Для order_status ( о котором идет речь в используемой колонке За исключением s ) 10. Статус заказа 10 должна быть рассчитана на основе даты.
  • 0
    Спасибо, это работает.
0

Используйте " условные агрегаты ", которые являются 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() если это то, что представляют цифры.

  • 0
    Я считаю, что использование COUNT(*) также более эффективно (хотя разница может быть довольно небольшой).
  • 0
    Где применить условие даты?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню