2015-07-23 2 views
0

Я пытаюсь реализовать некоторые статистические данные в своем приложении.Статистика групп MYSQL по диапазону двух дат для статистики

На самом деле я wqnt для отображения всех «продаж» (количество заказов и общая сумма) для диапазона двух дат.

Я использую следующий запрос:

SELECT COUNT(order.id), SUM(order.total_amount) FROM `order` WHERE payed_at BETWEEN "2015-07-01 00:00:00" AND "2015-08-25 00:00:00" 

Он работает в диапазоне. Теперь я хотел бы увеличить, как я хотел бы группу «все дни диапазона», «все месячники диапазона»

, например, для всех дней диапазона:

  • | 2015-07 -01 | 0 | 0 |
  • | 2015-07-02 | 1 | 3000 |
  • ...
  • | 2015-08-20 | 3 | 450 |

, например, для всех месяцев диапазона:

  • | 2015-07-01 | 40 | 15200 |
  • | 2015-08-01 | 23 | 3890 |

Можно ли выполнить это с тем же запросом, просто добавив что-то вроде «GROUP BY»?

Я знаю много разных способов получить результат, который я хочу ... но для моего времени я хотел бы сделать чистую вещь с MySQL, что-то немного «профессиональное».

Хороший день

+0

Вы пытались использовать GROUP BY? например: 'GROUP BY month (payed_at)' – Vatev

+0

Хорошо, после повторной попытки с некоторыми улучшениями, похоже, что это работает. –

ответ

1

Вы могли бы сделать что-то в стиле фанк с UNION ALL, но я бы, вероятно, держать три запроса отдельно.

Возможно, вы захотите, чтобы какой-либо код приложения визуализировал результаты в таблицу или график каких-либо родов, и я возьму накладные расходы на три вызова.

Я бы запускать запросы следующим образом:

SELECT COUNT(order.id), 
     SUM(order.total_amount) 
    FROM `order` 
    WHERE payed_at >= :start_date 
    AND payed_at < :end_date + INTERVAL 1 DAY 

    SELECT DATE(payed_at) payed_date 
     COUNT(order.id), 
     SUM(order.total_amount) 
    FROM `order` 
    WHERE payed_at >= :start_date 
    AND payed_at < :end_date + INTERVAL 1 DAY 
GROUP BY payed_date 

    SELECT EXTRACT(YEAR_MONTH FROM payed_at) payed_year_month 
     COUNT(order.id), 
     SUM(order.total_amount) 
    FROM `order` 
    WHERE payed_at >= :start_date 
    AND payed_at < :end_date + INTERVAL 1 DAY 
GROUP BY payed_year_month 

Я предпочитаю точную логику >=/< при запросе диапазона дат по инклюзивному BETWEEN.

При группировке по месяцам, как правило, важно помнить о включении года, если диапазон может охватывать год. Альтернативы EXTRACT включают LAST_DAY и DATE_FORMAT .. см. MySQL Date and Time Functions.

Другим вариантом является запуск только второго запроса (сгруппированный по дате) и сворачивание итогов месяца и диапазона в коде приложения.

+0

Три запроса выполняют эту работу. Я буду использовать что-то подобное, если не найду другого способа сделать это. В начале я бы использовал точно такой же запрос и играл с GROUP BY DAY/MONTH ... но мой тест на самом деле не очень хорош. BTW, большое спасибо за ваш ответ. –

+0

Нет проблем, с удовольствием помогите .. пожалуйста, примите ответ, если вы закончите использовать его :) – Arth

+0

Я подожду немного, чтобы увидеть, есть ли у кого-то другая идея. Иначе я буду принимать это завтра –