Access查询中根据Ins/Outs值实现加减计算生成新列的方法
Access查询实现Ins/Outs滚动累计的操作方法
前置要求:查询数据源必须包含一个可唯一确定记录顺序的排序字段(如自增主键ID、操作时间戳),无排序依据的累计计数逻辑不成立。以下示例默认使用自增ID字段ID作为排序键,存储Ins/Outs的字段名为操作类型(即你提到的A列),可根据实际情况替换。
方法1:使用内置DSum函数(无需编写代码)
适合数据量较小(千条以内)的场景,直接在查询中新增计算列即可:
- 打开查询设计视图,在空白列的「字段」行输入如下表达式:
累计值: DSum("IIf([操作类型]='Ins',1,-1)","你的数据源名称","ID<=" & [ID]) - 将表达式中
你的数据源名称替换为当前查询的源表/源查询的实际名称,操作类型、ID替换为对应字段的真实名称 - 保存查询后切换到数据表视图,即可看到生成的累计值列
方法2:使用VBA自定义函数(性能更优)
适合数据量较大的场景,查询速度远快于DSum方案:
- 按
Alt+F11打开VBA编辑器,右键点击当前数据库名称,选择「插入」-「模块」 - 在新建的模块中输入如下代码:
Public runTotal As Long Public lastSortVal As Long Function GetRunningTotal(curSortVal As Long, opType As String) As Long ' 查询重跑时自动重置缓存 If curSortVal < lastSortVal Then runTotal = 0 lastSortVal = 0 End If ' 根据操作类型增减累计值 If opType = "Ins" Then runTotal = runTotal + 1 ElseIf opType = "Outs" Then runTotal = runTotal - 1 End If lastSortVal = curSortVal GetRunningTotal = runTotal End Function - 保存模块后回到查询设计视图,在空白列的「字段」行输入如下表达式:
累计值: GetRunningTotal([ID],[操作类型]) - 确保查询按排序字段(即示例中的ID)升序排列,保存后运行即可得到累计值
注意:如果使用时间字段作为排序依据,建议增加ID作为第二排序字段,避免相同时间的记录累计顺序异常。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

