我有一个查询(在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,当它工作时,肯定似乎更快。
答案 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