【问题标题】:Ms Access query previous day's dateMs Access 查询前一天的日期
【发布时间】:2018-10-03 18:22:48
【问题描述】:

如何在 Ms Access 中构建查询以将前一天的金额包含为期初余额。因此,在运行查询时,我在 WorkDay 参数框中输入 3/10/18,并显示 3/10/18 和 2/10/18 的记录。表格设置如下:

工作日....交易ID....金额

2/10/18......开幕............1000

2/10/18......学分............500

2/10/18.......借方............300

2018 年 3 月 10 日.......信用........700

3/10/18.......借方............200

所以如果我运行 3/10/18 的查询,它应该返回

工作日....交易ID....金额

2/10/18......[Expr]............800

2018 年 3 月 10 日.......信用........700

3/10/18.......借方............200

【问题讨论】:

  • 请发布您正在使用的代码或表达式。如果可以,最好使用整个 SQL 语句,以便其他人可以看到您的表达式的上下文。如果不知道当前编码的确切内容,任何人都无法猜测问题是什么或提出解决方案。
  • 好的,很抱歉。请查看我编辑的帖子。
  • 但这只是数据,可能有用,但肯定不够。实际的查询……SQL 语句……决定了返回什么数据。
  • WorkDay - 日期/时间 TransactionID - 文本金额 - 双倍
  • 您的数据仅显示 2 个日期,但您希望多个日期的情况如何?如果缺少日期怎么办,比如周末?您是否希望将所有以前的日期 进行总结,还是仅对单个“前一天” 进行总结?另外,列出的日期是 mm/dd/yyyy 还是 dd/mm/yyyy?

标签: sql ms-access ms-access-2013 ms-access-2016


【解决方案1】:

如果您使用的是 GUI,请将 DateAdd("d",-1,[MyDateParameter]) 添加到 Workday 字段中 [MyDateParameter] 下的 OR 行。

对于 SQL WHERE 语句,您将使用

WorkDay=[MyDateParameter] OR Workday=DateAdd("d",-1,[MyDateParameter])

显然用你的实际日期参数替换[MyDateParameter]

【讨论】:

  • 我理解那部分,但我如何让查询结果包含 2/10/18 WorkDay(Opening+Debit-Credit)的 Total 和 3 的交易/10/18 工作日。
  • 您想聚合前一天的记录,但仍显示原始的当天记录,或者也聚合这些记录?第二种选择要简单得多。对于第一个,您将需要子查询和/或 SQL,您无法使用单个 GUI 驱动的查询来完成。
【解决方案2】:

首先关于请求的一些注释:

  1. 所需结果对当天和前一天提出了不同的要求,因此必须有两个不同的查询。如果要将它们放在一个结果集中,则需要使用 UNION。

    • (您可以编写单个 SQL UNION 查询,但由于 UNION 查询根本不适用于可视化设计器,因此您只能编写和测试查询,而没有查询设计视图的任何优势。因此,我的偏好是创建两个已保存的查询而不是嵌入的子查询,然后创建一个结合已保存查询结果的 UNION。)
  2. 无论是问题还是对 cme​​ts 的回答都没有说明如何处理任何异常,例如缺少日期、周末等。以下查询毫无例外地采用“前一天”。

  3. 另一个难点是 Credit 条目也有正数,所以必须特别处理。如果 Credits 以负值保存,则求和将简单直接。

查询当前:

PARAMETERS [Which WorkDay] DateTime;
SELECT S.WorkDay, S.TransactionID, Sum(S.[Amount]) As Amount
FROM [SomeUnspecifiedTable] As S
WHERE S.WorkDay = [Which WorkDay]
GROUP BY S.WorkDay, S.TransactionID

查询上一个:

PARAMETERS [Which WorkDay] DateTime;
SELECT S.WorkDay, "[Expr]" As TransactionID, 
  Sum(IIF(S.TransactionID = "Credit", -1, 1) * S.[Amount]) As Amount
FROM [SomeUnspecifiedTable] As S
WHERE S.WorkDay = ([Which WorkDay] - 1)
GROUP BY S.WorkDay

联合查询:

SELECT * FROM QueryCurrent
UNION
SELECT * FROM QueryPrevious
ORDER BY [WorkDay]

解决方案注意事项:

  • 您也可以使用 DateAdd() 函数,但从日期中添加/减去整数默认为更改天数。

【讨论】:

  • 不错。你做到了。它需要稍微打磨一下,但这正是我想要的。唯一的问题是前一天的数字没有加起来,即。 (Opening+Debit-Credit)和 QueryPrevious 上的 TransactionID 参数框正在弹出。哦,我确实注意到了可能发生的潜在问题,例如错过日期等。但现在只是小步骤。
  • 注意显式字段别名和表字段TransactionID之间可能存在的冲突。为了避免循环引用和无效参数提示,确保一切都是为了避免冲突。如果它要求 TransactionsID 作为参数,您需要像TableAlias.TransactionID 一样限定对表字段的引用,或者更正拼写,或者将显式值的别名更改为其他名称,例如"[Expr]" as TranID .这可能会解决求和问题,因为 Credit 的 -1 值取决于 TransactionID 字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多