有时需要追溯日期时根据日期运行总计

问题描述 投票:0回答:2

所以,我正在尝试在Microsoft Access 2010中创建一个基于日期的运行总计的查询。让我们通过假设查询基于名为tblT1的金融交易表来简化,其中三个字段按日期排序:

  • ID
  • TDA
  • 金额

目标:创建财务分类帐。

我可以通过使用在某种程度上在查询中创建此运行总计

DSUM("Amount", "tblT1", "TDate<=#" & TDate &"#")

这样做的问题是,如果有多个具有相同日期的交易,则匹配日期将显示相同的运行总计。运行总计仅针对每个日期更改进行更新,而不是针对每个事务进行更新。

围绕这个问题的一种方法是将DSUM标准建立在ID而不是TDate上。但这对我不起作用,因为有时候我需要追溯输入日期,这意味着我最终会得到ID值高于后续交易的旧交易。由于我按日期排序,因此将ID字段排除在外。是否有任何解决方法可以创建逐行更新的运行总计?

sql ms-access-2010
2个回答
1
投票

试试这个逻辑:

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;

0
投票

我最终解决了这个问题。解决方案是基于现有表创建一个查询(称之为“Query1”),并根据事务日期和现有ID(主键)包含一个新的复合ID(名为NewID)。然后,我基于Query1创建了第二个查询(Query2),并使用此NewID作为DSUM函数中的条件。但是,请注意几点:确保日期格式为YYYYMMDD,以便所有日期具有相同的位数,并按时间顺序排序。当您将现有ID添加到新的日期编号时,还要将现有ID格式化为您认为必要的数字(我选择6)。最后,您需要将所有内容都包含在Val()函数中。否则,它将在查询中显示为文本,并且可能无法在DSUM函数中正常运行。所以,这是查询2中的函数:DSUM(“Amount”,“tblT1”,“NewID <=”和NewID)

© www.soinside.com 2019 - 2024. All rights reserved.