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

MySQL实现逐行累计求和(Running Total)的查询求助

解决MySQL逐行累计求和问题

你的问题出在使用了普通的SUM()聚合函数配合GROUP BY idtablamtm——因为每个idtablamtm是唯一的,所以这个SUM()只会计算当前行的tablamtmdatos值,自然无法得到累计求和的效果。

要实现逐行累计,在MySQL 8.0及以上版本中,**窗口函数SUM() OVER()**是最简单高效的方案,它可以在不分组的情况下,对指定范围内的数据进行累加计算。结合你的表结构和需求,修正后的查询语句如下:

SELECT 
    tablamtmtipo AS 'tipe of operation',
    tablamtmdatos AS 'UMT',
    SUM(tablamtmdatos) OVER (ORDER BY idtablamtm) AS Total
FROM tablamtm 
WHERE tablamtmoperacion = 'operación 1'
ORDER BY idtablamtm;

关键说明:

  • SUM(tablamtmdatos) OVER (ORDER BY idtablamtm):这个窗口函数会按照idtablamtm的顺序,从第一行开始逐行累加tablamtmdatos的值,最终得到每行的累计总和。
  • 去掉了原来的GROUP BY idtablamtm,因为我们不需要分组,而是要保留所有符合条件的行并计算累计值。
  • 最后加上ORDER BY idtablamtm是为了确保行的顺序和累计逻辑一致,避免出现顺序混乱导致的累计错误。

如果你的MySQL版本低于8.0(不支持窗口函数),可以用子查询的方式实现:

SELECT 
    t1.tablamtmtipo AS 'tipe of operation',
    t1.tablamtmdatos AS 'UMT',
    (SELECT SUM(t2.tablamtmdatos) FROM tablamtm t2 WHERE t2.idtablamtm <= t1.idtablamtm AND t2.tablamtmoperacion = 'operación 1') AS Total
FROM tablamtm t1 
WHERE t1.tablamtmoperacion = 'operación 1'
ORDER BY t1.idtablamtm;

这种方式通过子查询统计当前行及之前所有行的tablamtmdatos总和,但性能比窗口函数差,尤其是数据量较大时,优先推荐窗口函数方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:37:41