如何用SQL基于两列计算行累计值?Total_c表需求实现
解决方案:计算基于前一行结果的累计值
需求逻辑
c列的核心计算规则是:
- 按
bill分组、id排序,累计计算每行的(b - a),即当前行c值 = 所有之前行(含当前行)的(b - a)之和 - 当累计值为负数时,格式化为
绝对值+'-';非负数直接显示数值
实现SQL(支持窗口函数的数据库:MySQL 8.0+、PostgreSQL、SQL Server等)
SELECT id, bill, a, b, CASE WHEN cumulative >= 0 THEN CAST(cumulative AS CHAR) ELSE CONCAT(ABS(cumulative), '-') END AS c FROM ( SELECT id, bill, a, b, -- 按bill分组、id排序,累计计算(b - a)的总和 SUM(b - a) OVER (PARTITION BY bill ORDER BY id) AS cumulative FROM Total_c ) AS sub_query;
说明
- 子查询中使用
SUM(b - a) OVER (PARTITION BY bill ORDER BY id):PARTITION BY bill:确保只在相同bill的组内计算累计ORDER BY id:保证按id的顺序依次累计
- 外层查询通过
CASE语句处理显示格式:- 累计值非负时直接转为字符串
- 累计值为负时,取绝对值后拼接'-',得到类似
6-的格式
测试结果
执行上述SQL后,将得到与需求完全一致的结果:
id bill a b c 1 a 0 10 10 2 a 0 5 15 3 a 0 3 18 4 a 11 0 7 5 a 13 0 6- 6 a 2 2 6-
内容的提问来源于stack exchange,提问作者mandarin software
相关产品推荐
相关产品推荐

