Задать вопрос
@danchikraw
Веб-додик

Как собирать статистику по разным промежуткам времени?

У меня есть база в которой я хрнаю информацию о пополнении и дате пополнения. Как посчитать пополнения за 24ч я знаю. А как разом посчитать за 24, неделю и месяц? Одним запросом.
SELECT `id_user`, SUM(`sum`) `sum`, users.name FROM `balance_history` INNER JOIN `users` ON `id_user` = users.id WHERE `date` >= NOW() - INTERVAL 1 DAY AND `type` = 'plus' GROUP BY `id_user` ORDER BY `sum` DESC
  • Вопрос задан
  • 18 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Используйте условное агрегирование.
SELECT `id_user`, 
       SUM(`sum`) `sum_month`, 
       SUM(`sum` * (`date` >= NOW() - INTERVAL 1 WEEK)) `sum_week`, 
       SUM(`sum` * (`date` >= NOW() - INTERVAL 1 DAY)) `sum_day`, 
       users.name 
FROM `balance_history` 
INNER JOIN `users` ON `id_user` = users.id 
WHERE `date` >= NOW() - INTERVAL 1 MONTH
  AND `type` = 'plus' 
GROUP BY `id_user`, users.name 
ORDER BY `sum` DESC


Выражения-аргументы SUM() - это упрощённое выражение типа

SUM(CASE WHEN {some condition}
         THEN {some value}
         ELSE 0
         END)


Ну а WHERE ещё и позволяет не трясти более древние записи, которые заведомо не учитываются ни в одной из сумм. Поэтому оно отбирает самый длительный из периодов суммирования, а заодно избавляет от условия агрегирования одно из выражений.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы