将查询的总和转换为排名列

时间:2018-06-22 10:18:24

标签: sql-server

我是一位SQL新手,仍在尝试了解MySQL和SQL Server之间的语法差异。我最近在MySQL上解决了这个问题,但在SQL Server上却看起来完全不同,我无法在这里使用它。

我想在查询中建立一个排名列。我有一个表EnrollmentX,其中有两列,一个唯一的StudentID和一个GroupId(组1:3)。我需要同时计算这三个组中每一个的学生数量,然后按学生数量对这些组进行排名。

最终结果应如下所示:

GroupId / StudentCnt / Rank
   2    /     20     /   1

...对于所有三个组,依此类推。但是,尽管我的大多数语法已在My SQL和SQL Server之间工作,但这引起了SQL Server的各种问题,尤其是在调用变量的方式与以前不同的情况下。

如何在SQL Server中解决此问题?

2 个答案:

答案 0 :(得分:1)

您可以这样做:

但是,如果该小组的学生人数相同,您不会写什么?那他们应该排名相等吗?

create table #test
(
groupid int, students int)

insert into #test
values
(1,10),
(1,14),
(2,10),
(2,5),
(2,5),
(4,40),
(5,25)

Select groupid,studentcnt ,rank() over(order by studentcnt) as rank from (
select groupid,sum(students) as StudentCnt from #test

group by groupid
)x

drop table #test

结果

enter image description here

答案 1 :(得分:1)

您可以根据需要使用RANKDENSE_RANK

请注意,当总数相符时,排名列中的下一个数字将在两者之间有何不同

DECLARE @t TABLE ( StudentId int, GroupId INT)
INSERT INTO @t 
VALUES(1, 1),(2, 2),(3, 2),(4, 2),(5, 3),(6, 3),(7, 3),(8, 3),(9, 2)

SELECT 
     GroupId
    ,StudentCnt = COUNT(StudentId)
    ,[Rank] = RANK()OVER(ORDER BY COUNT(StudentId) DESC)
    ,[DENSE_RANK] = DENSE_RANK()OVER(ORDER BY COUNT(StudentId) DESC)
FROM @t
GROUP BY
    GroupId

输出

GroupId StudentCnt  Rank    DENSE_RANK
2       4           1       1
3       4           1       1
1       1           3       2   --<< this row