如何在MySQL窗口框架中使用CASE语句计算列的累计总和?
用CASE语句实现每日销售额累计求和的最优方案
问题背景
现有sales表包含日期和销售额两列,数据如下:
| date | sales |
|---|---|
| 2019-04-01 | 50 |
| 2019-04-02 | 100 |
| 2019-04-03 | 100 |
需要通过CASE语句创建新列cumulative,展示每日销售额的累计总和,期望输出如下:
| date | sales | cumulative |
|---|---|---|
| 2019-04-01 | 50 | 50 |
| 2019-04-02 | 100 | 150 |
| 2019-04-03 | 100 | 250 |
最优实现方案
如果必须使用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;
代码说明
- 对
sales表进行自交叉连接(CROSS JOIN),让每一行数据都能和所有行做比对 - CASE语句筛选出
t2表中日期小于等于t1表当前行日期的销售额,符合条件则取对应sales值,否则取0 - 通过SUM函数汇总所有符合条件的销售额,得到当前日期的累计值
- 按
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
相关产品推荐
相关产品推荐

