【问题标题】:Issue when joining 3 temp tables加入 3 个临时表时的问题
【发布时间】:2022-01-13 22:10:24
【问题描述】:

我在加入 3 个临时表时遇到问题。

我有这样的桌子

  1. UDT_CKB_SNAPSHOT - 不同物品和活动的列表(特价物品)一些促销活动等

  2. FCSTPERFSTATIC - 预测

  3. HISTWIDE_CHAIN - 实际值

我将编写整个代码,但在选择所有三个临时表时不起作用的是连接。其他一切都很好(输入以防万一有人想看到整个图片)。

WITH UDT_CKB_SNAPSHOT AS
(
  SELECT  [UPC] ,[MASTERCHAINNAME] ,[EVENT_TYPE],[STARTDATE],[ENDDATE] ,[EVENT_NAME] 
  FROM [BYIntegration].[SCPOMGR].[UDT_CKB_SNAPSHOT]
  WHERE [EVENT_TYPE]='Promotion' AND
        [STARTDATE] BETWEEN '2021-09-26' AND '2021-12-08'
        
  GROUP BY [UPC] ,[MASTERCHAINNAME],[EVENT_TYPE],[STARTDATE],[ENDDATE] ,[EVENT_NAME] 
),

FCSTPERFSTATIC AS
( SELECT  [DMDUNIT],[STARTDATE],[LOC],SUM([TOTFCST]) AS 'Forecast'
   FROM [BYIntegration].[SCPOMGR].[FCSTPERFSTATIC]
   WHERE [STARTDATE] BETWEEN '2021-09-26' AND '2021-12-08'
   GROUP BY [DMDUNIT], [STARTDATE], [LOC]
),

HISTWIDE_CHAIN AS 
( SELECT [DMDUNIT] ,[DMDPostDate],[LOC] ,SUM([HistoryQuantity]) AS 'HistoryQuantity'
   FROM [BYIntegration].[SCPOMGR].[HISTWIDE_CHAIN]
   WHERE [DMDPostDate] BETWEEN '2021-09-26' AND '2021-12-08'

   GROUP BY [DMDUNIT], [DMDPostDate], [LOC]
)

**SELECT U.[UPC] AS 'Item', U.[MASTERCHAINNAME] AS 'Chain', U.[STARTDATE] AS 'Start Date', U.[EVENT_TYPE] , U.[EVENT_NAME], SUM(F.Forecast) AS 'Forecast', SUM(A.HistoryQuantity) AS 'Actuals'
FROM UDT_CKB_SNAPSHOT U  
LEFT OUTER JOIN FCSTPERFSTATIC F
on U.[UPC]=F.[DMDUNIT] AND U.[MASTERCHAINNAME]=F.[LOC] 
LEFT OUTER JOIN HISTWIDE_CHAIN A
ON  U.[UPC]=a.[DMDUNIT] AND U.[MASTERCHAINNAME]=a.[LOC] 
AND a.[DMDPostDate]=u.[STARTDATE] and  f.[STARTDATE]=a.[DMDPostDate]
GROUP BY U.[UPC], U.[MASTERCHAINNAME], U.[STARTDATE], U.[EVENT_TYPE] , U.[EVENT_NAME]**

所以问题是粗斜体字。

我需要在日期上连接所有三个表,以确保在同一时间段内选择相同的库存。每当我加入这三个表时,我要么得到正确的预测或实际值,但永远不会同时得到。

当我输入这个时,我得到预测正确,但实际不正确 a.[DMDPostDate]=u.[STARTDATE] 和 f.[STARTDATE]=a.[DMDPostDate](预测正确 6998.649,实际不正确 826)

-- AND u.[STARTDATE]=f.[STARTDATE] and f.[STARTDATE]=u.[STARTDATE](实际值正确 10369,预测不正确 8322.315)

-- 和 a.[DMDPostDate]=f.[STARTDATE](预测正确 6998.649,实际不正确)

-- AND u.[STARTDATE]=a.[DMDPostDate](预测正确 6998.649,实际不正确)

-- AND u.[STARTDATE]=f.[STARTDATE](实际正确 10369,预测不正确)

-- and u.[STARTDATE]=f.[STARTDATE] and u.[STARTDATE] = a.[DMDPostDate](预测正确6998.649,实际不正确)

当我分别运行所有三个查询时,一切正常,但是当我选择其中一个时,取决于我加入 STARTDATE 的方式出错。我几乎花了一整天的时间来解决问题,但我仍然不明白如何让它工作。

我将不胜感激。

【问题讨论】:

    标签: sql-server ssms


    【解决方案1】:

    当我输入这个时,我得到预测正确,但实际不正确 a.[DMDPostDate]=u.[STARTDATE] 和 f.[STARTDATE]=a.[DMDPostDate](预测正确 6998.649,实际不正确 826)

    -- AND u.[STARTDATE]=f.[STARTDATE] and f.[STARTDATE]=u.[STARTDATE](实际值正确 10369,预测不正确 8322.315)

    -- 和 a.[DMDPostDate]=f.[STARTDATE](预测正确 6998.649,实际不正确)

    -- AND u.[STARTDATE]=a.[DMDPostDate](预测正确 6998.649,实际不正确)

    -- AND u.[STARTDATE]=f.[STARTDATE](实际正确 10369,预测不正确)

    -- and u.[STARTDATE]=f.[STARTDATE] and u.[STARTDATE] = a.[DMDPostDate](预测正确 6998.649,实际不正确)

    从您的帖子中 - 加入 STARTDATEs 可以让您获得正确的实际数据,而加入 DMDPostDate 到任一开始日期似乎可以得到正确的预测。

    需要考虑的事情 - u.[STARTDATE]=f.[STARTDATE] - 这个子句应该对 A 表连接没有影响,如果你将它添加到 F 表 ON 子句,然后 u.[STARTDATE ] = a.[DMDPostDate] 到 A 表子句

    它现在的工作方式是根据 U.[UPC]=F.[DMDUNIT] AND U.[MASTERCHAINNAME]=F 将表 F 中的所有内容连接到表 A 中可以连接的所有内容。 [LOC],没有任何日期。因此,它评估条款的方式可能是一个挑战。

    黑马答案 - 您不需要在任何日期加入 - 当您不加入 A 表的日期时,实际值是正确的 - 当您使用 AND u.[STARTDATE]= f.[STARTDATE]它可能适用于 U/F 连接,这可能会降低预测数。

    您还可以通过将 F 和 A 表分别连接到 U 表来进行故障排除,以查看您是否获得了预期值。

    最佳猜测 -

    SELECT 
        U.[UPC] AS 'Item', 
        U.[MASTERCHAINNAME] AS 'Chain', 
        U.[STARTDATE] AS 'Start Date', 
        U.[EVENT_TYPE] , 
        U.[EVENT_NAME], 
        SUM(F.Forecast) AS 'Forecast', 
        SUM(A.HistoryQuantity) AS 'Actuals'
    FROM
        UDT_CKB_SNAPSHOT U  
    LEFT OUTER JOIN 
        FCSTPERFSTATIC F ON U.[UPC] = F.[DMDUNIT] 
                         AND U.[MASTERCHAINNAME] = F.[LOC] 
                         AND f.[STARTDATE] = u.[STARTDATE]
    LEFT OUTER JOIN 
        HISTWIDE_CHAIN A ON U.[UPC] = a.[DMDUNIT] 
                         AND U.[MASTERCHAINNAME] = a.[LOC] 
                         AND a.[DMDPostDate] = u.[STARTDATE] 
    GROUP BY 
        U.[UPC], U.[MASTERCHAINNAME], U.[STARTDATE], U.[EVENT_TYPE] , U.[EVENT_NAME]
    

    【讨论】:

    • 关于第一点,你的意思是 f.[STARTDATE]=a.[DMDPostDate] 和 u.[STARTDATE]=a.[DMDPostDate] 吗?如果是这样,它没有给出正确的计算。
    • 我不确定我是否理解第二个想法......
    • 就“黑马答案”而言,当我不参加任何日期时,它是完全不正确的数据。
    • 这是一个奇怪的思想问题 - 最好的步骤可能是通过分别连接 U/F 表和 U/A 表来分离问题。我猜 U/F 连接需要将 u.[STARTDATE]=f.[STARTDATE] 添加到连接条件中,而 U/A 连接将使用您发布的这个版本 u.[STARTDATE] = a.[ DMDPostDate] - 这是我对第二个想法的建议。我在“最佳猜测”下添加了我的意思作为编辑。
    • 回过头来看,我删除了原来的第一点——我花了更多时间解决你的问题,这肯定超出了范围。
    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2020-11-30
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多