Why does my query break after this? I’m essentially running calculations based off the columns of both tables and then setting their PVPLevel when rn is a certain value between 1 and 5000.
SET PVPRanking.PVPLevel = CASE
x
USE DNWorld
GO
WITH cte AS (
SELECT PVPScores.PVPWin, PVPScores.PVPLose, PVPRanking.Death, PVPRanking.[Kill], PVPRanking.PVPExp,
RANK() OVER (ORDER BY (((PVPScores.PVPWin * 1) + (PVPRanking.[Kill] * 0.2) + (PVPRanking.PvpExp * 0.002)) - ((PVPScores.PVPLose * 0.5) + (PVPRanking.Death * 0.1) + (PVPScores.PvPGiveUp * 0.5))) DESC, PVPScores.CharacterID DESC ) AS rn
FROM PvPRanking
INNER JOIN PVPScores
ON PVPRanking.CharacterID = PVPScores.CharacterID
)
UPDATE cte
SET PVPRanking.PVPLevel = CASE
WHEN rn = 1 THEN 26 -- #1 Rank Champion
WHEN rn BETWEEN 2 AND 10 THEN 25 -- Reita
WHEN rn BETWEEN 11 and 20 THEN 24 -- Warlord
WHEN rn BETWEEN 21 and 30 then 23 -- Slayer
WHEN rn BETWEEN 31 and 40 then 22 -- WATCH OUT
WHEN rn BETWEEN 41 and 50 then 21 -- Royalty
WHEN rn BETWEEN 51 and 60 then 20 -- Knight of Justice
WHEN rn BETWEEN 61 and 70 then 19 -- Furious Fiend
WHEN rn BETWEEN 71 and 85 then 18 -- Devil of PVP
WHEN rn BETWEEN 86 and 100 then 17 -- God Of PvP
WHEN rn BETWEEN 101 and 125 then 16 -- Death God
WHEN rn BETWEEN 126 and 150 then 15 -- Master
WHEN rn BETWEEN 151 and 175 then 14 -- Unpredictable Demon
WHEN rn BETWEEN 176 and 250 then 13 -- Demon
WHEN rn BETWEEN 251 and 300 then 12 -- Crazy Fiend
WHEN rn BETWEEN 301 and 400 then 11 -- Fiend
WHEN rn BETWEEN 401 and 500 then 10 -- Bloodthirsty
WHEN rn BETWEEN 501 and 600 then 9 -- Kavalan
WHEN rn BETWEEN 601 and 700 then 8 -- Keepo
WHEN rn BETWEEN 701 and 800 then 7 -- Senior PvP Tactician
WHEN rn BETWEEN 801 and 900 then 6 -- PvP Tactician
WHEN rn BETWEEN 901 and 1000 then 5 -- Senior Apprentice
WHEN rn BETWEEN 1001 and 1100 then 4 -- Apprentice
WHEN rn BETWEEN 1101 and 1500 then 3 -- Lesser Novice
WHEN rn BETWEEN 1501 and 2000 then 2 -- Novice
WHEN rn BETWEEN 2000 and 5000 then 1 -- Egg
ELSE 1
END
WHERE rn <= 5000;
Advertisement
Answer
It appears that you only need to include PVPLevel
in the select list of the CTE:
WITH cte AS (
SELECT ps.PVPWin, ps.PVPLose, pr.Death, pr.[Kill], pr.PVPExp, pr.PVPLevel,
RANK() OVER (ORDER BY (((ps.PVPWin * 1) + (pr.[Kill] * 0.2) + (pr.PvpExp * 0.002)) - ((ps.PVPLose * 0.5) + (pr.Death * 0.1) + (ps.PvPGiveUp * 0.5))) DESC, ps.CharacterID DESC ) AS rn
FROM PvPRanking pr
INNER JOIN PVPScores ps ON pr.CharacterID = ps.CharacterID
)
Then, continue with your current update query as is. Note that the update itself could be simplified a bit, resting on that the range checks are always increasing from top to bottom:
UPDATE cte
SET PVPLevel = CASE WHEN rn = 1 THEN 26 -- #1 Rank Champion
WHEN rn <= 10 THEN 25 -- Reita
WHEN rn <= 20 THEN 24 -- Warlord
WHEN rn <= 30 THEN 23 -- Slayer
WHEN rn <= 40 THEN 22 -- WATCH OUT
WHEN rn <= 50 THEN 21 -- Royalty
WHEN rn <= 60 THEN 20 -- Knight of Justice
WHEN rn <= 70 THEN 19 -- Furious Fiend
WHEN rn <= 85 THEN 18 -- Devil of PVP
WHEN rn <= 100 THEN 17 -- God Of PvP
WHEN rn <= 125 THEN 16 -- Death God
WHEN rn <= 150 THEN 15 -- Master
WHEN rn <= 175 THEN 14 -- Unpredictable Demon
WHEN <= 250 THEN 13 -- Demon
WHEN <= 300 THEN 12 -- Crazy Fiend
WHEN <= 400 THEN 11 -- Fiend
WHEN <= 500 THEN 10 -- Bloodthirsty
WHEN <= 600 THEN 9 -- Kavalan
WHEN <= 700 THEN 8 -- Keepo
WHEN <= 800 THEN 7 -- Senior PvP Tactician
WHEN rn <= 900 THEN 6 -- PvP Tactician
WHEN rn <= 1000 THEN 5 -- Senior Apprentice
WHEN rn <= 1100 THEN 4 -- Apprentice
WHEN rn <= 1500 THEN 3 -- Lesser Novice
WHEN rn <= 2000 THEN 2 -- Novice
WHEN rn <= 5000 THEN 1 -- Egg
ELSE 1 END
WHERE rn <= 5000;