Access查询中的DSUM会在随机记录中生成Null

时间:2013-10-17 13:00:33

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

我有一个查询(在MS Access 2013中),它为我提供了按日期的各种项目的销售额,为下一个12mo的每一天。在另一张表格中,我将每件商品的已知采购时间称为30至90天。 我创建了一个查询,对于每个项目,我根据提前期计算了未来日期,使用:

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

我验证了Sales查询中存在的所有项目,并且所有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,当它工作时,肯定似乎更快。

1 个答案:

答案 0 :(得分:1)

当将包含在哈希标记(#)中的日期文字的SQL语句(或片段)“粘合在一起”时,必须记住Access SQL和VBA总是将不明确的日期文字解释为{{1无论系统范围的日期格式如何。因此,在Windows已配置为使用mm-dd-yyyy的计算机上,明确的日期(如4月30日)可以正常运行

dd-mm-yyyy

...但是对于第二天,即5月1日,事情并没有那么顺利

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

所以,经验教训是,每当我们“粘合”日期文字时,我们必须确保这些日期采用明确的格式,如?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