Access Query中基于项目和日期的运行总计
Posted
技术标签:
【中文标题】Access Query中基于项目和日期的运行总计【英文标题】:Running total in Access Query based on item and date 【发布时间】:2018-10-16 14:36:48 【问题描述】:我在尝试创建一个计算字段的 Access Query 时遇到了困难,该字段显示了商店中已退回或退回的零件的运行总数;在一个表中按日期顺序排序。
“DMPartsT”表如下所示:
ID RecordDate PartID PartTransactions
1 12/04/2018 3 6
22 22/02/2017 9 14
3 18/05/2018 5 7
2 12/11/2017 3 -3
11 25/09/2018 7 12
4 21/06/2018 5 -2
5 14/07/2018 8 43
7 15/01/2018 3 18
6 24/03/2018 10 30
8 25/05/2018 3 -2
我的目标是让查询返回一个表,其中包含一个添加的计算字段,该字段将显示特定部分的运行总计,按日期排序。例如,PartID = 3,生成的结果应该如下:
ID RecordDate PartID PartTransactions PartTotal
2 12/11/2017 3 -3 -3
7 15/01/2018 3 18 15
1 12/04/2018 3 6 21
8 25/05/2018 3 -2 19
查询应该查看表中的所有可用数据。
我在计算字段中使用了最明显的选择 DSUM 表达式,但成功率很低。我使用的代码版本如下:
PartTotal: IIf([PartID]=3,DSum("[PartTransactions]","DmPartsT","[RecordDate]<=#" & [RecordDate] & "#"))
并且,“RecordDate”按 Acsending 排序,“PartID”在查询窗口中过滤为 3,我以正确的日期顺序获得类型 3 的所有部分的列表,但是 Part_Total 数字都不正确!
如果有人能帮助找出正确的方法,我将不胜感激。谢谢。
【问题讨论】:
【参考方案1】:如果你要使用DSum
,你需要格式化你的字符串。但是您应该很少在查询中使用域聚合。在几乎所有情况下,您都应该只使用子查询。
另外,求和时还需要指定部分 ID,因此请将其包含在子查询(或域聚合)的 WHERE
子句中。
PartTotal: (SELECT SUM([PartTransactions]) FROM DmPartsT t WHERE t.[RecordDate]<= DMPartsT.[RecordDate] AND t.PartID = DmPartsT.PartID)
这避免了来回转换为字符串时的错误,并允许优化器分析和优化您的查询。
【讨论】:
你的表情很到位。谢谢你。这是按照我的意愿完成任务,但只是为了确定和理解操作,你是说这不是最好的方法,使用子查询是正确的方法吗?如果是这样,请您解释一下主查询和子查询对数据执行的单独功能。 是的。子查询由数据库引擎处理。域聚合由 Access 应用程序运行并运行查询,这意味着,对于每一行,您都有很多开销(从 DB 引擎到应用程序再到 DB 引擎),并且如果您从外部应用程序执行,它只是不起作用。正确的域聚合应该是DSum("[PartTransactions]","DmPartsT","[RecordDate]<=#" & Format([RecordDate], "yyyy-mm-dd & "# AND PartID = " & PartID)
,但不要使用它。以上是关于Access Query中基于项目和日期的运行总计的主要内容,如果未能解决你的问题,请参考以下文章
Rails Active Record Query工作日总计离开
如何在MS ACCESS中从另一个查询中传递PARAMETERS到查询中(不用VBA)?