方法1:使用窗口函数(MySQL 8.0及以上版本)
如果您的MySQL版本支持窗口函数(8.0+),按日期分组并计算累计总和:
SELECT
sale_date,
daily_total,
SUM(daily_total) OVER (ORDER BY sale_date) AS cumulative_sum
FROM (
SELECT
DATE(sale_date) AS sale_date,
SUM(amount) AS daily_total
FROM
sales
WHERE
sale_date BETWEEN '2023-01-01' AND '2023-01-31'
GROUP BY
DATE(sale_date)
) AS daily_sales
ORDER BY
sale_date;
说明:
内层查询按天汇总数据,外层使用窗口函数计算累计。
DATE(sale_date)确保按日期分组,忽略时间部分(如果存在)。
方法2:生成连续日期并处理缺失数据(MySQL 8.0+)
若需补全缺失日期(如无销售记录的天数显示0):
WITH RECURSIVE dates (date) AS (
SELECT '2023-01-01'
UNION ALL
SELECT date + INTERVAL 1 DAY FROM dates WHERE date < '2023-01-31'
)
SELECT
d.date,
COALESCE(SUM(s.amount), 0) AS daily_total,
SUM(COALESCE(SUM(s.amount), 0)) OVER (ORDER BY d.date) AS cumulative_sum
FROM
dates d
LEFT JOIN
sales s ON d.date = DATE(s.sale_date)
GROUP BY
d.date
ORDER BY
d.date;
说明:
使用递归CTE生成连续日期。左连接确保所有日期都被包含,缺失数据用0填充
方法3:使用用户变量(MySQL 5.7及以下版本)
对于不支持窗口函数的旧版本,通过变量模拟累计:
SELECT
sale_date,
daily_total,
(@cumulative := @cumulative + daily_total) AS cumulative_sum
FROM (
SELECT
DATE(sale_date) AS sale_date,
SUM(amount) AS daily_total
FROM
sales
WHERE
sale_date BETWEEN '2023-01-01' AND '2023-01-31'
GROUP BY
DATE(sale_date)
ORDER BY
sale_date
) AS daily_sales
CROSS JOIN (SELECT @cumulative := 0) AS vars;
注意:
- 变量@cumulative需在子查询外初始化。
- 确保子查询结果已正确排序,避免累计计算错误。
参数说明
- sale_date: 表中的日期字段。
- amount: 需累加的数值字段。
- 时间范围: 替换BETWEEN '开始时间' AND '结束时间'调整统计周期。