根据项目和日期在Access Query中运行总计

时间:2018-10-16 14:36:48

标签: sql ms-access access-vba

我在尝试创建一个计算字段来显示正在运行中已退回或退回的零件总数的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”按升序排序,并将“ PartID”过滤为3,我会以正确的日期顺序获得类型3的所有零件的列表,但是Part_Total的数字全都不正确!

如果有人能帮忙找出正确的方法,我将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

如果要使用DSum,则需要格式化字符串。但是,您很少应该在查询中使用域聚合。在几乎所有情况下,您都应该只使用子查询。

此外,在求和时还需要指定部件ID,因此请将其包含在子查询的WHERE子句中(或域聚合)。

PartTotal: (SELECT SUM([PartTransactions]) FROM DmPartsT t WHERE t.[RecordDate]<=  DMPartsT.[RecordDate] AND t.PartID = DmPartsT.PartID)

这可以避免在来回转换为字符串时出错,并使优化器可以分析和优化您的查询。