我有比较前面的字符串的波纹管代码,看它们是否匹配。代码正在处理只有1或2个欺骗的记录。
如果有3个或更多,则当前代码不起作用。
我需要做的是将旧代码显示为该行的ID。新代码我需要是列表中的第一个匹配项,在示例中它将是131133.这需要是所有匹配项的新代码。
然后我需要替换的代码出现在Deleted代码中,并且只需要替换的代码。在这个例子中,这应该是141439。
我可以用我的代码来实现这个目标吗?或者我是否需要从另一个角度解决这个问题?
提前谢谢。
;WITH MyCTE AS
(
SELECT *,
ROW_NUMBER()OVER (ORDER BY SortField) AS rn
FROM Aron_Reporting.dbo.Customer_Sort
)
SELECT T1.Forename as Forename, T1.pcode, T1.Surname as Surname,T1.SortField AS T1String,
T2.SortField AS T2String,
T1.IDNO as OldCode,
CASE
WHEN T1.SortField IS NULL OR T1.SortField = ' ' OR T2.SortField = ' ' or T2.SortField IS NULL THEN T1.IDNO
WHEN T1.SortField = T2.SortField THEN T2.IDNO ELSE T1.IDNO END AS NewCode,
CASE
WHEN T1.SortField IS NULL OR T1.SortField = ' ' or T2.SortField = ' ' or T2.SortField IS NULL THEN ' '
WHEN T1.SortField = T2.SortField THEN T2.IDNO ELSE ' ' END AS DeleteCode
FROM MyCTE T1
LEFT JOIN MyCTE T2
ON T1.rn = T2.rn+1
答案 0 :(得分:0)
我不确定你要做什么,所以希望这会有所帮助。
使用子查询计算所需的代码可以处理任意数量的重复项。子查询需要返回匹配的第一条记录(包括其自身)。
以下示例分为几小步,以便您可以准确了解数据的操作方式。
-- Generate table structure
DECLARE @TestData TABLE (
ID INT
, ValueToCompare VARCHAR(MAX)
, Code INT
, NewCode INT
)
-- Generate test data
INSERT INTO @TestData
( ID, ValueToCompare, Code )
VALUES (1, 'John', 1134), (2, 'Joe', 1546), (3, 'Joe', 1893), (4, 'Joe', 9785), (5, 'Joe', 9452)
-- View the original data
SELECT *
FROM @TestData
-- View what the NewCode will be
SELECT ID
, ValueToCompare
, Code
, (SELECT MIN(Code) -- This subquery uses the MIN statement to grab the first record from a list of matching records
FROM @TestData SubQueryData
WHERE MainQueryData.ValueToCompare = SubQueryData.ValueToCompare
) AS 'New_Code'
FROM @TestData MainQueryData
-- Set the NewCode value
UPDATE @TestData
SET NewCode = (SELECT MIN(Code)
FROM @TestData SubQueryData
WHERE MainQueryData.ValueToCompare = SubQueryData.ValueToCompare
)
FROM @TestData MainQueryData
-- Delete duplicate records
DELETE
FROM @TestData
WHERE Code <> NewCode
-- View the resulting data
SELECT *
FROM @TestData