【发布时间】: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