【问题标题】:MERGE statement never getting a MATCHMERGE 语句从未得到 MATCH
【发布时间】:2022-10-13 15:16:31
【问题描述】:

我对 SQL 很陌生,正在尝试更改我继承的一些现有代码。对于冗长的代码,我深表歉意,但我将所有内容都包括在内,因为我不确定什么是重要的。简而言之,我正在尝试更新存储过程(这是最后一位)的输出以包含 4 个新字段。我已确认 #TotalDocSales 包含新字段,但此合并无法将其添加到 #PromoDiscountSales。我已经目视检查了这两个表,并且可以确认 ON 部分中的数据应该产生匹配。我在 SELECT 语句中添加了 CONVERT 函数,以便使两个表的数据类型完全对齐。 (我不知道这是否有必要,但它似乎是一个开始的地方。)

MERGE INTO #PromoDiscountSales AS T
USING (
        SELECT  CONVERT(date, Dttransdate) AS DtTransDate, 
                r.WeekENDing, 
                r.MonthName, 
                r.MonthPeriod, 
                r.FYE, 
                CONVERT(varchar(12), DocNumber) As DocNumber, 
                CONVERT(varchar(5), DocType) AS DocType,  
                CONVERT(int, LocationNum) AS LocationNum, 
                l.LocationNumName, 
                l.Region, 
                StoreType, 
                CONVERT(varchar(25), ItemNum) AS ItemNum, 
                LTRIM(RTRIM(Description)) As ItemDescription, 
                PromoItemNum, 
                LTRIM(RTRIM(PromoItemDesc)) AS PromoItemDescription, 
                CONVERT(int, VendorNum) AS VendorNum, 
                VendorName ,
                CONVERT(int, DepartmentNum) As DepartmentNum, 
                CONVERT(varchar(25), ItemGroup) AS ItemGroup,
                CONVERT(varchar(25), PromoAppliedOn) AS PromoAppliedOn, 
                CONVERT(varchar(200), PromoAppliedOnVendor) AS PromoAppliedOnVendor, 
                TotalSales, 
                COGS, 
                QtySold, 
                DiscountAmt as DiscountAmount, 
                TotalSalesAfterDisc as NetTotalSales, 
                NoOfPromoQty, 
                RetailPrice, 
                PromoSalesPrice, 
                GrossSales,
                RedTagItemCode,
                VendorsItemNum,
                PosSlsprsnNum1,
                PosSlsprsnNum2,
                PosSlsprsnNum3

        FROM   #TotalDocSales t
        JOIN C_PRODUCTION.dbo.TU_MD_RETAILCALENDAR r with (nolock) 
            ON t.DtTransDate = r.Date
        JOIN C_PRODUCTION.dbo.TU_MD_LOCATION l with (nolock) 
            ON t.LocationNum = l.LocNum
        WHERE  (TotalSales <> 0 
                OR COGS <> 0 
                OR QtySold <> 0 
                OR QtySold <> 0 
                OR TotalSalesAfterDisc <> 0 
                OR RetailPrice <> 0 
                OR PromoSalesPrice <> 0 
                OR GrossSales <> 0)

) AS S
ON T.DtTransDate = S.DtTransDate 
   AND .LocationNum = S.LocationNum 
   AND T.DocNumber = S.DocNumber 
   AND T.DocType = S.DocType 
   AND LTRIM(RTRIM(T.ItemNum)) = LTRIM(RTRIM(S.ItemNum)) 
   AND T.VendorNum  = S.VendorNum  
   AND LTRIM(RTRIM(T.ItemGroup)) = LTRIM(RTRIM(S.ItemGroup)) 
   AND T.DepartmentNum = S.DepartmentNum
   AND LTRIM(RTRIM(T.PromoAppliedOn)) = LTRIM(RTRIM(S.PromoAppliedOn))
   AND LTRIM(RTRIM(ISNULL(T.PromoAppliedOnVendor,''))) = LTRIM(RTRIM(ISNULL(S.PromoAppliedOnVendor,'')))

WHEN  MATCHED 
        
THEN UPDATE
SET 
    VendorsItemNum = S.VendorsItemNum,
    PosSlsprsnNum1 = S.PosSlsprsnNum1,
    PosSlsprsnNum2 = S.PosSlsprsnNum2,
    PosSlsprsnNum3 = S.PosSlsprsnNum3,
    UpdatedDate = GETDATE()

WHEN  NOT MATCHED BY TARGET THEN INSERT

    (   DtTransDate, 
        WeekENDing, 
        MonthName, 
        MonthPeriod, 
        FYE, 
        DocNumber, 
        DocType, 
        LocationNum, 
        LocationNumName, 
        Region, 
        StoreType, 
        ItemNum, 
        RedTagItemCode,
        ItemDescription, 
        PromoItemNum, 
        PromoItemDescription, 
        VendorNum , 
        VendorName , 
        DepartmentNum, 
        ItemGroup, 
        PromoAppliedOn, 
        PromoAppliedOnVENDor, 
        TotalSales, 
        COGS, 
        QtySold, 
        RetailPrice, 
        PromoSalesPrice, 
        DiscountAmount, 
        NetTotalSales, 
        NoOfPromoQty, 
        GrossSales, 
        VendorsItemNum,
        PosSlsprsnNum1,
        PosSlsprsnNum2,
        PosSlsprsnNum3,
        LoadedDate)

    VALUES (
        S.DtTransDate, 
        S.WeekENDing, 
        S.MonthName, 
        S.MonthPeriod, 
        s.FYE, 
        s.DocNumber, 
        s.DocType, 
        s.LocationNum, 
        s.LocationNumName, 
        s.Region, 
        s.StoreType, 
        s.ItemNum, 
        s.RedTagItemCode,
        s.ItemDescription, 
        s.PromoItemNum, 
        s.PromoItemDescription, 
        s.VendorNum , 
        s.VendorName ,
        s.DepartmentNum, 
        s.ItemGroup, 
        s.PromoAppliedOn, 
        s.PromoAppliedOnVENDor, 
        s.TotalSales, 
        s.COGS, 
        s.QtySold, 
        s.RetailPrice,
        s.PromoSalesPrice, 
        s.DiscountAmount, 
        s.NetTotalSales, 
        s.NoOfPromoQty,
        s.GrossSales, 
        s.VendorsItemNum,
        s.PosSlsprsnNum1,
        s.PosSlsprsnNum2,
        s.PosSlsprsnNum3,   
        GETDATE());

【问题讨论】:

  • 你应该在条件@jaydubs之间有and子句
  • 谢谢普拉哈尔。 AND 在原始代码中,但我在此处发布时不小心删除了它们。它们已被添加进来。
  • 我将从将合并语句转换为两个数据集之间的内部联接开始,如果您没有得到结果,则开始注释联接条件,直到返回数据。
  • 感谢罗斯的建议。我这样做了,内部连接工作得很好。
  • 嗨罗斯。我想让你知道我能够解决这个问题。你为我指明了正确的方向。我的一种数据类型是大小不正确的 varchar,这就是停止合并的原因。

标签: sql


【解决方案1】:

VendorsItemNum数据类型varchar(16)#PromoDiscountSales但是varchar(25)#TotalDocSales,所以当合并到这个任务时:VendorsItemNum = S.VendorsItemNum 它停止了。

一旦我改变了供应商项目编号数据类型为varchar(25) in#PromoDiscountSales合并可以继续进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 2017-01-18
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多