You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL窗口框架中使用CASE语句计算列的累计总和?

用CASE语句实现每日销售额累计求和的最优方案

问题背景

现有sales表包含日期和销售额两列,数据如下:

datesales
2019-04-0150
2019-04-02100
2019-04-03100

需要通过CASE语句创建新列cumulative,展示每日销售额的累计总和,期望输出如下:

datesalescumulative
2019-04-015050
2019-04-02100150
2019-04-03100250

最优实现方案

如果必须使用CASE语句完成需求,最合理的方式是通过自连接+CASE条件判断来计算累计值,SQL代码如下:

SELECT 
    t1.date,
    t1.sales,
    SUM(CASE WHEN t2.date <= t1.date THEN t2.sales ELSE 0 END) AS cumulative
FROM 
    sales t1
CROSS JOIN 
    sales t2
GROUP BY 
    t1.date, t1.sales
ORDER BY 
    t1.date;

代码说明

  1. 对sales表进行自交叉连接(CROSS JOIN),让每一行数据都能和所有行做比对
  2. CASE语句筛选出t2表中日期小于等于t1表当前行日期的销售额,符合条件则取对应sales值,否则取0
  3. 通过SUM函数汇总所有符合条件的销售额,得到当前日期的累计值
  4. 按t1.date分组并排序,保证结果按日期顺序输出

额外建议

实际上,大多数现代SQL数据库(如MySQL 8.0+、PostgreSQL、SQL Server等)支持窗口函数,用窗口函数实现累计求和会更高效简洁,代码如下:

SELECT 
    date,
    sales,
    SUM(sales) OVER(ORDER BY date) AS cumulative
FROM sales
ORDER BY date;

如果业务场景没有强制要求必须使用CASE语句,优先推荐这种窗口函数方案。

内容的提问来源于stack exchange,提问作者jislesplr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:07:07