You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨双表按双日期求和异常:交付量未遵循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

额外说明

  1. 为什么原查询的WHERE条件看起来没生效?
    其实你的日期过滤是生效的,但重复计算让结果远超预期,误以为是汇总了全部历史。
  2. 关于LEFT JOIN的注意点:
    原查询中WHERE子句里对FinalFcst的过滤条件(比如FinalFcst.SKU = '10_LB')会把LEFT JOIN变相转为INNER JOIN——因为如果某个客户没有符合条件的预测记录,FinalFcst的字段会是NULL,WHERE条件会直接过滤掉这些行。如果需要保留有交付但无预测的客户数据,原查询应该把FinalFcst的过滤条件放到ON子句中,而不是WHERE里。不过用先汇总再关联的方式,这个问题自然就解决了。

内容的提问来源于stack exchange,提问作者Snowy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:01:11