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
相关产品推荐
相关产品推荐

