Подсчитать сумму продаж за последние 7 рабочих дней - PullRequest
0 голосов
/ 22 апреля 2020

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

SELECT weekday(date), sum(amount) FROM m1pay_dashboard.transactions where date > (DATE(NOW()) - INTERVAL 7 DAY)
group by weekday(date)

В этом запросе будут отображены выходные данные:

|   | weekday     | sale  |
| - | ----------  | ----- |
| 1 | Monday      | 20    |
| 2 | Tuesday     | 50    |
| 3 | Friday      | 120   |
| 4 | Saturday    | 140   |
| 5 | Sunday      | 110   |

но у меня должна быть распродажа на все 7 дней. (показывает ноль для дней, которых не существует) вот пример вывода, который мне нужен:

|   | weekday     | sale  |
| - | ----------  | ----- |
| 1 | Monday      | 20    |
| 2 | Tuesday     | 50    |
| 3 | Wednesday   | 0     |
| 4 | Thursday    | 0     |
| 5 | Friday      | 120   |
| 6 | Saturday    | 140   |
| 7 | Sunday      | 110   |

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Одним из простых решений является объединение при загрузке нулевых записей (только 7, не обременительно), например:

SELECT d, sum(amount) 
FROM 
(
  SELECT dayofweek(date) as d, amount 
  FROM m1pay_dashboard.transactions 
  where date > (DATE(NOW()) - INTERVAL 7 DAY)
  UNION ALL
  SELECT 1, 0
  UNION ALL 
  SELECT 2, 0
  ...
  UNION ALL 
  SELECT 7, 0
) x
group by d

Будучи равными нулю, они не будут участвовать в суммах, а будут давать ноль для тех дней, которые Недостаточно продаж

Если вы тоже хотите указать название дня, добавьте еще один столбец в верхний запрос и строку для всех профсоюзов, но помните о любых обязательствах по интернационализации / локализации: было бы неразумно Жесткий код Engli sh слов, если вы однажды запустите отчет на французской платформе - лучше оставить его только как номер дня и сделать так, чтобы передний конец сделал его именем в зависимости от перевода, даже если целевая страна считает день 1 воскресенье или понедельник

1 голос
/ 22 апреля 2020

Один из способов сделать это - использовать таблицу чисел, чтобы сгенерировать количество дней до того времени, которое вас интересует, а затем LEFT JOIN в таблицу transactions:

SELECT WEEKDAY(CURDATE() - INTERVAL days.n DAY) AS weekday, COALESCE(SUM(t.amount), 0) AS total
FROM (SELECT 0 AS n UNION ALL SELECT 1 
      UNION ALL SELECT 2 UNION ALL SELECT 3
      UNION ALL SELECT 4 UNION ALL SELECT 5
      UNION ALL SELECT 6) days
LEFT JOIN m1pay_dashboard.transactions t ON t.`date` = CURDATE() - INTERVAL days.n DAY
GROUP BY weekday

Демо (с фиксированной датой вместо CURDATE()) на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...