-- Try this
USE TEMPDB
--Sample Table
Create Table dbo.rCodeTypeTest
(rID int Identity (1,1)
,rType varchar(6)
,rCode char(2)
,rValue char(1)
,rPos int
)
--Sample Date
INSERT dbo.rCodeTypeTest (rType, rCode) VALUES ('ADD' , 'S1')
INSERT dbo.rCodeTypeTest (rType, rCode) VALUES ('ADD' , 'S2')
INSERT dbo.rCodeTypeTest (rType, rCode) VALUES ('DELETE' , 'S2')
INSERT dbo.rCodeTypeTest (rType, rCode) VALUES ('DELETE' , 'S1')
INSERT dbo.rCodeTypeTest (rType, rCode) VALUES ('ADD' , 'S3')
INSERT dbo.rCodeTypeTest (rType, rCode) VALUES ('ADD' , 'S3')
SELECT * FROM dbo.rCodeTypeTest
-- Assumption: a code will be repeated only twice
-- Display what the rValue will be
SELECT rct1.rID, rct1.rType, rct1.rCode
,CASE WHEN rct1.rType = rct2.rType THEN 'X'
WHEN rct1.rType = 'ADD' AND rct2.rType = 'DELETE' THEN 'A'
WHEN rct2.rType = 'ADD' AND rct1.rType = 'DELETE' THEN 'B'
ELSE NULL
END as rValue
, rct2.rID ,rct2.rType, rct2.rCode
FROM dbo.rCodeTypeTest rct1
JOIN dbo.rCodeTypeTest rct2
ON rct1.rCode = rct2.rCode
AND rct1.rID != rct2.rID
WHERE rct1.rValue IS NULL
AND rct2.rValue IS NULL
ORDER BY rct1.rCode, rValue
BEGIN TRAN -- Must Lock Table so that when we get the max PosID it won't change until we are done
-- Update the rValue
UPDATE dbo.rCodeTypeTest
SET rValue = CASE WHEN dbo.rCodeTypeTest.rType = rct2.rType THEN 'X'
WHEN dbo.rCodeTypeTest.rType = 'ADD' AND rct2.rType = 'DELETE' THEN 'A'
WHEN rct2.rType = 'ADD' AND dbo.rCodeTypeTest.rType = 'DELETE' THEN 'B'
ELSE NULL
END
FROM dbo.rCodeTypeTest
JOIN dbo.rCodeTypeTest rct2
ON dbo.rCodeTypeTest.rCode = rct2.rCode
AND dbo.rCodeTypeTest.rID != rct2.rID
WHERE dbo.rCodeTypeTest.rValue IS NULL
AND rct2.rValue IS NULL
-- Figure out Position (only necessary for SQL 2000 in SQL 2005 could use row_number function)
DECLARE @rPosID Table (rPos int Identity(1,1), rID int)
INSERT @rPosID (rID)
SELECT rID
FROM dbo.rCodeTypeTest
WHERE rPos IS NULL
ORDER BY rCode, rValue
SELECT * FROM @rPosID
DECLARE @MaxPos int
SELECT @MaxPos = ISNULL(MAX(rPos),0)
FROM dbo.rCodeTypeTest
SELECT @MaxPos + P.rPos, rct.*
FROM dbo.rCodeTypeTest rct
JOIN @rPosID P
ON P.rID = rct.RID
ORDER BY rct.rCode, rct.rValue
UPDATE dbo.rCodeTypeTest
SET rPos = @MaxPos + P.rPos
FROM dbo.rCodeTypeTest rct
JOIN @rPosID P
ON P.rID = rct.RID
Commit TRAN
SELECT * FROM dbo.rCodeTypeTest
Order BY rPos
David Lundell
Principal Consultant and Trainer
www.mutuallybeneficial.com