【问题标题】:DSUM in Access query yields Nulls in random recordsAccess 查询中的 DSUM 在随机记录中产生 Null
【发布时间】:2013-10-17 13:00:32
【问题描述】:

我有一个查询(在 MS Access 2013 中),它按日期为我提供各种项目的销售额,在接下来的 12 个月中的每一天。在另一个表中,我为每个项目提供了已知的采购提前期,比如 30 到 90 天。 我创建了一个查询,对于每个项目,我根据提前期计算了未来日期,使用:

FutureDate: DateAdd("d",[Leadtime],Date())

我验证了 Sales 查询中存在所有 Items,并且所有 FutureDates 都在 Sales 中存在的记录中。

我需要计算从现在到计算出的每个项目的 [FutureDate] 之间的每日销售额总和,以获得在每个项目的唯一交付周期内预期的总销售额。

我尝试了 DSUM() 函数,结果很奇怪:

每日销售额的查询已经排除了任何过去的销售额,所以我的第一次尝试是:

TotalSalesInLeadtime: DSUM("DailySales","Sales","[DayOfSale]<=#" & [FutureDate] & "# AND [Item]='" & [SearchedItem] &"'")

对于某些项目,[TotalSalesInLeadtime] 计算正确,而其他项目评估为 Null。

然后我尝试了:

TotalSalesInLeadtime: DSUM("DailySales","Sales","[DayOfSale] BETWEEN #" Date() "# AND #" & [FutureDate] & " AND [Item]='" & [SearchedItem] &"'")

现在的结果是相反的。 [TotalSalesInLeadtime] 值现在对于之前显示为 Null 的项目正确显示,并且对于之前正确评估的项目为 Null。

我一直不明白为什么 DSUM() 会这样做。

为了解决 DSUM() 故障,我使用了一个嵌入式子查询,它正确生成了所有值,尽管性能受到了显着影响:

SELECT [PurchItem],
        (SELECT Sum([DailySales]) AS SumOfSales
         FROM [Sales] 
         WHERE ([Item]=[LeadtimeItems].[PurchItem]) AND ([DayOfSale] Between Date() AND [LeadtimeItems].[FutureDate]))
        As TotalSalesInLeadtime
FROM LeadtimeItems

如果有人知道为什么 DSUM 会出现这种行为,我将不胜感激。 DSUM,当它工作时,肯定会更快。

【问题讨论】:

  • 您的机器不会碰巧使用dd/mm/yyyy 日期格式,对吗?
  • 是的,数据库使用dd/mm/yyyy格式。我想你是不是在做点什么?

标签: ms-access subquery ms-access-2010


【解决方案1】:

当“粘合”SQL 语句(或片段)时,包括用散列标记 (#) 括起来的日期文字,必须牢记 Access SQL 和 VBA 将始终将不明确的日期文字解释为 mm-dd-yyyy,无论系统范围的日期格式。因此,在 Windows 已配置为使用 dd-mm-yyyy 的机器上,像 4 月 30 日这样的明确日期可以正常工作

?DateSerial(2013,4,30)
30-04-2013 
?"#" & DateSerial(2013,4,30) & "#"
#30-04-2013#
?Eval("#" & DateSerial(2013,4,30) & "#")
30-04-2013 

...但是第二天,5 月 1 日,事情就不那么顺利了

?DateSerial(2013,5,1)
01-05-2013 
?"#" & DateSerial(2013,5,1) & "#"
#01-05-2013#
?Eval("#" & DateSerial(2013,5,1) & "#")
05-01-2013 

所以教训是,任何时候我们将日期文字“粘合在一起”,我们必须确保这些日期采用明确的格式,例如yyyy-mm-dd。关于这个特定的问题,我们需要使用

TotalSalesInLeadtime: DSUM("DailySales","Sales","[DayOfSale]<=#" & Format([FutureDate], "yyyy-mm-dd") & "# AND [Item]='" & [SearchedItem] &"'")

【讨论】:

  • 使用yyyy-mm-dd 确实在每一行都产生了结果。但是,当我将子查询方法的结果与 DSum() 的结果进行比较时,使用 DSum 进行查询的记录数恰好少了一条记录。我复制/粘贴了结果,找到了丢失的记录。如果我使用 Access 接口对 Dsum 查询应用过滤器,则会找到记录。当我重新查询时,记录数仍然短了一个。复制粘贴进行静态比较,我发现缺少一条不同的记录...过滤它会找到记录。其他一些故障模式在这里起作用。我坚持使用子查询方法。
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多