I work on a 2012 MS-SQL server and have a USER table with Age, Gender among other fields and a SALES table with sales records.
I am currently calculating a Sales Leaderboard showing a list of sellers ordered by their TOP Sales, so, to give an example, this list returns various sales details based on their Top Sales. Somewhere in the middle of the list, we have Mr. Thomas, who says that this is No. 4.
My current task is to show how Thomas compares with sales representatives who are the same age as him, as well as how he compares with a seller who has the same gender as him. The calculation will lead to a different result than the general list described above.
My ideal stored procedure will receive 1 parameter (UserId) and return the following single record of values: OverallPosition, TotalPositionTotalCount, AgePosition, AgeTotalCount, GenderPosition, GenderTotalCount
SAMPLE DATA:
CREATE TABLE dbo.User ( UserId int NOT NULL IDENTITY (1, 1), Name nvarchar(50) NOT NULL, Age int NULL, Gender nvarchar(10) NULL ) 1, James, 30, 'male' 2, Monica, 27, 'female' 3, Paul, 30, 'male' 4, Thomas, 30, 'male' 5, Mike, 22, 'male' 6, Sabrina, 30, 'female' CREATE TABLE dbo.Sales ( SalesId int NOT NULL IDENTITY (1, 1), UserId int NOT NULL, TotalSale int NOT NULL ) ON [PRIMARY] 1, 1, $900,000 2, 1, $1,000,000 3, 2, $900,000 4, 2, $400,000 5, 3, $750,000 6, 3, $300,000 7, 4, $875,000 8, 5, $700,000 9, 5, $1,200,000 10, 6, $850,000
List of sales leaders
SELECT u.UserId, u.Name, MAX(s.TotalSale) as TopSale, Count(*) OVER () AS TotalCount FROM User u INNER JOIN Sales s on s.UserId = u.UserId GROUP BY u.UserID, u.Name ORDER BY TopSale DESC OFFSET (@PageIndexSelected) * @PageCountSelected ROWS FETCH NEXT @PageCountSelected ROWS ONLY
Ideal calculation results
Since Thomas (userId 4) is 30 years old and “male,” his statistics should look like this:
OverallPosition = 4; OverallPositionTotalCount = 6 (ie 4 out of 6) $1,200,000 Mike $1,000,000 James $900,000 Monica $875,000 Thomas $850,000 Sabrina $750,000 Paul AgePosition = 2; AgeTotalCount = 4 (ie 2 out of 4) $1,000,000 James $875,000 Thomas $850,000 Sabrina $750,000 Paul GenderPosition = 3; GenderTotalCount = 4 (ie 3 out of 4) $1,200,000 Mike $1,000,000 James $875,000 Thomas $750,000 Paul
Note
The expected result is ONLY the values for TotalPosition, TotalPositionTotalCount, AgePosition, AgeTotalCount, GenderPosition, GenderTotalCount for one user (the stored procedure will receive UserId as a parameter), and NOT the actual list.
EXPECTED RETURN
General position = 4,
OverallPositionTotalCount = 6,
AgePosition = 2,
AgeTotalCount = 4,
GenderPosition = 3,
GenderTotalCount = 4
As I said in my comments, I really don’t know how to approach this problem. I hope someone wants to help!