MySQL запрос кумулятивной суммы не возвращает ожидаемых результатов - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь создать запрос MySQL (MySQL v5), который суммирует записи вызовов по дням / входящему номеру с текущим накопленным итогом. Я ссылался на другие страницы в Stack Overflow, но результаты, которые я получаю, не складываются.

Ссылки: MYSQL совокупная сумма по дате MySQL совокупный порядок сумм по дате

Запрос выглядит так:

SET @RUNNING_TOTAL :=0;
SELECT
    DATE_FORMAT(start,'%d/%m/%Y') As CallDate,
    ch.did AS InboundNo,
    COUNT(*) AS DayTotal,
    (@RUNNING_TOTAL := @RUNNING_TOTAL + COUNT(*)) AS CumulativeCalls
FROM
    `call_history` ch
LEFT JOIN (SELECT callid, event FROM ast_queue_log WHERE event = 'ENTERQUEUE') aql ON aql.callid = ch.callid
WHERE
    ch.did = '01234567891' AND
    start BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW()
GROUP BY
    ch.did, DATE(start)
ORDER BY
    ch.did;

Я ожидал бы следующего вывода:

+-------------------------------+-------------+----------+-----------------+
| CallDate                      | InboundNo   | DayTotal | CumulativeCalls |
+-------------------------------+-------------+----------+-----------------+
| 01/05/2020                    | 01234567891 |      232 |             232 |
| 02/05/2020                    | 01234567891 |       50 |             282 |
| 03/05/2020                    | 01234567891 |       14 |             296 |
| 04/05/2020                    | 01234567891 |      246 |             542 |
| 05/05/2020                    | 01234567891 |      187 |             729 |
| 06/05/2020                    | 01234567891 |      182 |             911 |
| 07/05/2020                    | 01234567891 |      105 |            1016 |
| 08/05/2020                    | 01234567891 |       46 |            1062 |
| 09/05/2020                    | 01234567891 |       26 |            1088 |
| 10/05/2020                    | 01234567891 |        7 |            1095 |
| 11/05/2020                    | 01234567891 |      255 |            1350 |
+-------------------------------+-------------+----------+-----------------+

Я получаю те же значения в DayTotal и CumulativeCalls за каждый день.

1 Ответ

0 голосов
/ 27 мая 2020

В MySQL 8+ вы должны использовать оконные функции:

SELECT DATE_FORMAT(DATE(start), '%d/%m/%Y') As CallDate,
       ch.did AS InboundNo,
       COUNT(*) AS DayTotal,
       SUM(COUNT(*)) OVER (PARTITION BY ch.did ORDER BY DATE(start)) as  CumulativeCalls
FROM call_history ch LEFT  JOIN
     ast_queue_log aql
     ON aql.event = 'ENTERQUEUE' AND aql.callid = ch.callid
WHERE ch.did = '01234567891' AND
      start BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND NOW()
GROUP BY ch.did, DATE(start)
ORDER BY ch.did;

Примечания:

  • Подзапрос не требуется для LEFT JOIN.
  • Все столбцы должны быть уточнены. Из какой таблицы берется start?
  • GROUP BY и SELECT согласованы с помощью DATE(start) в операторе SELECT.

В более старых версиях of MySQL, вам потребуются переменные и подзапрос:

SELECT dc.*,
       (@s := @s + DayTotal) as CumulativeCalls
FROM (SELECT DATE_FORMAT(DATE(start), '%d/%m/%Y') As CallDate,
             ch.did AS InboundNo,
             COUNT(*) AS DayTotal
      FROM call_history ch LEFT  JOIN
           ast_queue_log aql
           ON aql.event = 'ENTERQUEUE' AND aql.callid = ch.callid
      WHERE ch.did = '01234567891' AND
            start BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND NOW()
      GROUP BY ch.did, DATE(start)
      ORDER BY ch.did, DATE(start)
     ) dc CROSS JOIN
     (SELECT @s := 0) params;
...