跨双表按双日期求和异常:交付量未遵循WHERE日期限制
问题分析与解决方案
看起来你遇到的问题是因为先关联表再汇总导致的重复计算,而非WHERE子句的日期限制没生效。让我拆解一下原因:
你的查询用了DelUnits LEFT JOIN FinalFcst,如果某个客户在FinalFcst中有多条符合日期/SKU条件的记录(比如不同日期的预测行),那么DelUnits中对应的12月交付行就会被重复匹配多次。最终SUM(DelUnits.Value)会把同一笔交付量计算多次,结果看起来像是汇总了全部历史数据,但实际是重复计算了12月的交付数据。
修复后的查询语句
正确的做法是先分别汇总两个表的目标数据,再进行关联,这样可以避免一对多关系带来的重复计算:
-- 先汇总12月的交付数据 WITH DeliveredSummary AS ( SELECT Customer, ObsText01, SUM(Value) AS TotalDelivered FROM DelUnits WHERE Date >= '2017-12-01' AND Date <= '2017-12-31' AND ObsText01 = '10_LB' GROUP BY Customer, ObsText01 ), -- 再汇总1月的预测数据 ForecastSummary AS ( SELECT Customer, SKU, SUM(FinalFcst) AS ForecastSales FROM FinalFcst WHERE DT >= '2018-01-01' AND DT <= '2018-01-31' AND SKU = '10_LB' GROUP BY Customer, SKU ) -- 最后关联两个汇总结果 SELECT ds.Customer, ds.ObsText01, fs.SKU, fs.Customer, ds.TotalDelivered, fs.ForecastSales FROM DeliveredSummary ds LEFT JOIN ForecastSummary fs ON ds.Customer = fs.Customer
额外说明
- 为什么原查询的WHERE条件看起来没生效?
其实你的日期过滤是生效的,但重复计算让结果远超预期,误以为是汇总了全部历史。 - 关于LEFT JOIN的注意点:
原查询中WHERE子句里对FinalFcst的过滤条件(比如FinalFcst.SKU = '10_LB')会把LEFT JOIN变相转为INNER JOIN——因为如果某个客户没有符合条件的预测记录,FinalFcst的字段会是NULL,WHERE条件会直接过滤掉这些行。如果需要保留有交付但无预测的客户数据,原查询应该把FinalFcst的过滤条件放到ON子句中,而不是WHERE里。不过用先汇总再关联的方式,这个问题自然就解决了。
内容的提问来源于stack exchange,提问作者Snowy
相关产品推荐
相关产品推荐

