首页 > 解决方案 > 通过 SUM() 递增 MySql 变量不正确

问题描述

我正在尝试组合一个查询,该查询按日期对记录进行分组以及该特定日期的总数(一天中可以有多个条目),但我还需要一个我打算使用 MySQL 变量的运行总数。我的问题是累积总计列似乎仅包含该日期的 SUM() 。

所以这适用于每日总数

SELECT
YEAR(log_at) as year,
MONTH(log_at) as month,
DAY(log_at) as day,
SUM(ev) as dailyTotal,
count(*) as count
FROM tracks
WHERE user_id = 1
GROUP BY year, month, day
ORDER BY year, month, day ASC

添加我认为将是一个相当简单的变量来跟踪运行总数

SET @cumulative := 0;

SELECT
YEAR(log_at) as year,
MONTH(log_at) as month,
DAY(log_at) as day,
SUM(ev) as dailyTotal,
@cumulative := @cumulative + sum(ev) AS cumulative,
count(*) as count
FROM tracks
WHERE user_id = 1
GROUP BY year, month, day
ORDER BY year, month, day ASC

在此处输入图像描述 而累积变量只包含当天的总数。但是,如果我将其更改为递增 1 而不是 SUM() 它似乎可以正常工作

在此处输入图像描述

非常感谢任何有关实现所需行为的建议!

标签: mysql

解决方案


您必须首先创建整个选择,然后才能执行累积操作,因为您不能同时附加 GROUP BY 列的总和(我真的不知道为什么要面团)

SELECT 
`year`,
`month`,
`day`,
`dailyTotal`,
@cum := @cum + `dailyTotal` as `cumulative`,
`count`
FROM
(
SELECT
YEAR(log_at) as year,
MONTH(log_at) as month,
DAY(log_at) as day,
SUM(ev) as dailyTotal,
count(*) as count
FROM tracks
WHERE user_id = 1
GROUP BY year, month, day
ORDER BY year, month, day ASC
) a
JOIN (SELECT @cum := 0) b

我用稍微不那么密集的表格对其进行了测试……也许我在这里弄错了。但我希望你能得到这个理论。


推荐阅读