MS Access中实现单列逐行累计求和并写入另一列对应行的方法咨询
MS Access 实现列累计求和的解决方案
首先需要确认你的表存在唯一可确定行顺序的字段(如自增主键ID、记录创建时间),累计计算依赖固定的行排序逻辑,无确定排序的情况下无法保证累计结果符合预期。
方法1:查询直接输出累计结果(无需修改表数据)
假设你的表名为业务表,需要累计的数值列名为数值,排序用的唯一字段为ID,查询SQL如下:
SELECT t1.ID, t1.数值, (SELECT SUM(t2.数值) FROM 业务表 t2 WHERE t2.ID <= t1.ID) AS 累计值 FROM 业务表 t1 ORDER BY t1.ID;
该查询会逐行计算当前行及之前所有行的数值总和,你示例中的数值按该逻辑计算,得到的累计值列正好为4000、3350、2720。
方法2:将累计值写入表的指定列
如果你需要把计算好的累计结果填充到表已有的累计值列中,可以用更新查询:
UPDATE 业务表 t1 SET t1.累计值 = ( SELECT SUM(t2.数值) FROM 业务表 t2 WHERE t2.ID <= t1.ID );
如果你的数据量较大,子查询效率偏低,可以用VBA遍历记录集实现,效率更高:
Sub 计算累计值() Dim rs As DAO.Recordset Dim sumTotal As Long ' 按排序字段打开记录集 Set rs = CurrentDb.OpenRecordset("SELECT 数值, 累计值 FROM 业务表 ORDER BY ID") sumTotal = 0 Do While Not rs.EOF sumTotal = sumTotal + rs!数值 rs.Edit rs!累计值 = sumTotal rs.Update rs.MoveNext Loop rs.Close Set rs = Nothing End Sub
注意事项
- 若用日期类字段作为排序依据,若存在多条记录日期相同的情况,需要增加ID作为次级排序条件,避免重复值导致累计计算错误。
- 若表数据会频繁新增/修改,建议优先用方法1的动态查询获取累计值,不需要每次修改数据后重新计算填充列。
内容的提问来源于stack exchange,提问作者Tahir Islam
相关产品推荐
相关产品推荐

