所以,我正在尝试在Microsoft Access 2010中创建一个基于日期的运行总计的查询。让我们通过假设查询基于名为tblT1的金融交易表来简化,其中三个字段按日期排序:
目标:创建财务分类帐。
我可以通过使用在某种程度上在查询中创建此运行总计
DSUM("Amount", "tblT1", "TDate<=#" & TDate &"#")
这样做的问题是,如果有多个具有相同日期的交易,则匹配日期将显示相同的运行总计。运行总计仅针对每个日期更改进行更新,而不是针对每个事务进行更新。
围绕这个问题的一种方法是将DSUM标准建立在ID而不是TDate上。但这对我不起作用,因为有时候我需要追溯输入日期,这意味着我最终会得到ID值高于后续交易的旧交易。由于我按日期排序,因此将ID字段排除在外。是否有任何解决方法可以创建逐行更新的运行总计?
试试这个逻辑:
DSUM("Amount",
"tblT1",
"(TDate < #" & TDate & "#) OR (TDate = #" & TDate &"# AND ID <= " & ID)"
)
如果您将此作为查询,这将看起来像:
select t.*,
(select sum(t2.amount)
from transactions as t2
where t2.tdA = t.tdA and -- not sure if this is necessary
(t2.date < t.date or
t2.date = t.date and t2.id <= t.id
)
) as running_amount
from transactions as t;
我最终解决了这个问题。解决方案是基于现有表创建一个查询(称之为“Query1”),并根据事务日期和现有ID(主键)包含一个新的复合ID(名为NewID)。然后,我基于Query1创建了第二个查询(Query2),并使用此NewID作为DSUM函数中的条件。但是,请注意几点:确保日期格式为YYYYMMDD,以便所有日期具有相同的位数,并按时间顺序排序。当您将现有ID添加到新的日期编号时,还要将现有ID格式化为您认为必要的数字(我选择6)。最后,您需要将所有内容都包含在Val()函数中。否则,它将在查询中显示为文本,并且可能无法在DSUM函数中正常运行。所以,这是查询2中的函数:DSUM(“Amount”,“tblT1”,“NewID <=”和NewID)