Reputation: 248
I have a table like this and I have difficulty updating it
code descd slnum
---------------------
10 a 0
10 b 0
12 c 0
12 d 0
11 e 0
12 f 0
I have to update this table like this without using ROW_NUMBER()
only by using if else loops how can I do that?
code descd slnum
----------------------
10 a 1
10 b 2
12 c 1
12 d 2
11 e 1
12 f 3
Upvotes: 1
Views: 651
Reputation: 35
;WITH rownum(code, descd, slnum) AS (
SELECT 10, 'a', 0
UNION SELECT 10, 'b', 0
UNION SELECT 12, 'c', 0
UNION SELECT 12, 'd', 0
UNION SELECT 11, 'e', 0
UNION SELECT 12, 'f', 0
) SELECT code, descd, COUNT(*) OVER (PARTITION BY code ORDER BY code
) FROM rownum ORDER BY descd
Upvotes: 0
Reputation: 4082
Try this
DECLARE @Tbl TABLE(code VARCHAR(5), descd VARCHAR(5), slnum int)
INSERT INTO @Tbl
( code, descd)
VALUES
('10', 'a'),
('10', 'b'),
('12', 'c'),
('12', 'd'),
('11', 'e'),
('12', 'f')
DECLARE @TempTable TABLE(code VARCHAR(5), descd VARCHAR(5), RowId int)
DECLARE @RowId INT = 1
WHILE @RowId <= (SELECT COUNT(*) FROM @Tbl)
BEGIN
INSERT INTO @TempTable
SELECT TOP 1
T.code ,
T.descd ,
@RowId
FROM
@Tbl T LEFT JOIN
@TempTable L ON L.code = T.code AND L.descd = T.descd
WHERE
L.code IS null
ORDER BY
T.code,
T.descd
UPDATE @Tbl
SET slnum = (SELECT COUNT(1) FROM @TempTable A WHERE [@Tbl].Code = A.Code)
WHERE
[@Tbl].Code = (SELECT TOP 1 Y.code FROM @TempTable Y WHERE RowId = @RowId) AND
[@Tbl].descd = (SELECT TOP 1 Y.descd FROM @TempTable Y WHERE RowId = @RowId)
SET @RowId += 1
END
SELECT * from @Tbl
Result:
code descd slnum
10 a 1
10 b 2
12 c 1
12 d 2
11 e 1
12 f 3
Upvotes: 0
Reputation: 1078
For SQL 2012+
;WITH rownum(code, descd, slnum) AS (
SELECT 10, 'a', 0
UNION SELECT 10, 'b', 0
UNION SELECT 12, 'c', 0
UNION SELECT 12, 'd', 0
UNION SELECT 11, 'e', 0
UNION SELECT 12, 'f', 0
) SELECT code, descd, COUNT(*) OVER (PARTITION BY code ORDER BY code
ROWS UNBOUNDED PRECEDING) FROM rownum o ORDER BY descd
Upvotes: 1