Hello, I have a following SP I want to add an extra field "ranking" that just increments the row number. Another feature would be: if several users have an equal totalvalue, they should have an equal ranking number. the rankings following users would have to be adjusted as well. thanks SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE PROCEDURE [dbo].[Rankings] @iErrorCode int OUTPUT AS SELECT top 30 ###COUNTER##, [user], [totalvalue], [cash], [stocksvalue] FROM [dbo].[users] ORDER BY totalvalue DESC SELECT @iErrorCode=@@ERROR GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
There is more than one way to rank a set with tied values. CREATE TABLE Users (userid INTEGER PRIMARY KEY, totalvalue NUMERIC(10,2) NOT NULL, cash NUMERIC(10,2) NOT NULL, stocksvalue NUMERIC(10,2) NOT NULL) INSERT INTO Users VALUES (101,1010,100,99) INSERT INTO Users VALUES (102,2020,100,99) INSERT INTO Users VALUES (103,3030,100,99) INSERT INTO Users VALUES (104,3030,100,99) INSERT INTO Users VALUES (105,1002,100,99) INSERT INTO Users VALUES (106,1002,100,99) INSERT INTO Users VALUES (107,1002,100,99) INSERT INTO Users VALUES (108,1002,100,99) INSERT INTO Users VALUES (109,1000,100,99) See if this gives the result you expect: SELECT COUNT(U2.totalvalue)+1 AS ranking, U1.userid, U1.totalvalue, U1.cash, U1.stocksvalue FROM Users AS U1 LEFT JOIN Users AS U2 ON U1.totalvalue < U2.totalvalue GROUP BY U1.userid, U1.totalvalue, U1.cash, U1.stocksvalue ORDER BY ranking, U1.userid Result: ranking userid totalvalue cash stocksvalue ----------- ----------- ------------ ------------ ------------ 1 103 3030.00 100.00 99.00 1 104 3030.00 100.00 99.00 3 102 2020.00 100.00 99.00 4 101 1010.00 100.00 99.00 5 105 1002.00 100.00 99.00 5 106 1002.00 100.00 99.00 5 107 1002.00 100.00 99.00 5 108 1002.00 100.00 99.00 9 109 1000.00 100.00 99.00 (9 row(s) affected) Or maybe this: SELECT COUNT(DISTINCT U2.totalvalue) AS ranking, U1.userid, U1.totalvalue, U1.cash, U1.stocksvalue FROM Users AS U1 LEFT JOIN Users AS U2 ON U1.totalvalue <= U2.totalvalue GROUP BY U1.userid, U1.totalvalue, U1.cash, U1.stocksvalue ORDER BY ranking, U1.userid Result: ranking userid totalvalue cash stocksvalue ----------- ----------- ------------ ------------ ------------ 1 103 3030.00 100.00 99.00 1 104 3030.00 100.00 99.00 2 102 2020.00 100.00 99.00 3 101 1010.00 100.00 99.00 4 105 1002.00 100.00 99.00 4 106 1002.00 100.00 99.00 4 107 1002.00 100.00 99.00 4 108 1002.00 100.00 99.00 5 109 1000.00 100.00 99.00 (9 row(s) affected) -- David Portas SQL Server MVP --
thank you! it works fine. "David Portas" <REMOVE_BEFORE_REPLYING_dportas@acm.org> schrieb im Newsbeitrag news:1pmdnW4hl-GFFt3dRVn-uA@giganews.com... [quoted text, click to view] > There is more than one way to rank a set with tied values. > > CREATE TABLE Users (userid INTEGER PRIMARY KEY, totalvalue NUMERIC(10,2) NOT > NULL, cash NUMERIC(10,2) NOT NULL, stocksvalue NUMERIC(10,2) NOT NULL) > > INSERT INTO Users VALUES (101,1010,100,99) > INSERT INTO Users VALUES (102,2020,100,99) > INSERT INTO Users VALUES (103,3030,100,99) > INSERT INTO Users VALUES (104,3030,100,99) > INSERT INTO Users VALUES (105,1002,100,99) > INSERT INTO Users VALUES (106,1002,100,99) > INSERT INTO Users VALUES (107,1002,100,99) > INSERT INTO Users VALUES (108,1002,100,99) > INSERT INTO Users VALUES (109,1000,100,99) > > See if this gives the result you expect: > > SELECT COUNT(U2.totalvalue)+1 AS ranking, > U1.userid, U1.totalvalue, U1.cash, U1.stocksvalue > FROM Users AS U1 > LEFT JOIN Users AS U2 > ON U1.totalvalue < U2.totalvalue > GROUP BY U1.userid, U1.totalvalue, U1.cash, U1.stocksvalue > ORDER BY ranking, U1.userid > > Result: > > ranking userid totalvalue cash stocksvalue > ----------- ----------- ------------ ------------ ------------ > 1 103 3030.00 100.00 99.00 > 1 104 3030.00 100.00 99.00 > 3 102 2020.00 100.00 99.00 > 4 101 1010.00 100.00 99.00 > 5 105 1002.00 100.00 99.00 > 5 106 1002.00 100.00 99.00 > 5 107 1002.00 100.00 99.00 > 5 108 1002.00 100.00 99.00 > 9 109 1000.00 100.00 99.00 > > (9 row(s) affected) > > Or maybe this: > > SELECT COUNT(DISTINCT U2.totalvalue) AS ranking, > U1.userid, U1.totalvalue, U1.cash, U1.stocksvalue > FROM Users AS U1 > LEFT JOIN Users AS U2 > ON U1.totalvalue <= U2.totalvalue > GROUP BY U1.userid, U1.totalvalue, U1.cash, U1.stocksvalue > ORDER BY ranking, U1.userid > > Result: > > ranking userid totalvalue cash stocksvalue > ----------- ----------- ------------ ------------ ------------ > 1 103 3030.00 100.00 99.00 > 1 104 3030.00 100.00 99.00 > 2 102 2020.00 100.00 99.00 > 3 101 1010.00 100.00 99.00 > 4 105 1002.00 100.00 99.00 > 4 106 1002.00 100.00 99.00 > 4 107 1002.00 100.00 99.00 > 4 108 1002.00 100.00 99.00 > 5 109 1000.00 100.00 99.00 > > (9 row(s) affected) > > -- > David Portas > SQL Server MVP > -- > >
Don't see what you're looking for? Try a search.
|