如何显示每个部门的最高分数及其名称

时间:2019-07-23 07:12:11

标签: sql sql-server group-by aggregate-functions

我可以选择每个部门的最高分数,但不能显示与最高分数相关的每个人的姓名。 我试图选择名称和最高等级(具有最高功能),但是它不起作用:

select max(stgrade)as highscore,StName,DepName --department
from TBL_DEPARTMANTS d
inner join TBL_LESSONS l on d.DepID=l.LessonID
inner join TBL_GRADES g on g.lessonid=l.LessonID
inner join TBL_STUDENT s on s.STID=g.stid
group by DepName,StName
order by DepName,highscore desc

2 个答案:

答案 0 :(得分:1)

您可以尝试...

select * from ( select rank() over (partition by DepName order by stgrade desc) as Slno, stgrade, stname, DepName 
from TBL_DEPARTMANTS d
inner join TBL_LESSONS l on d.DepID=l.LessonID
inner join TBL_GRADES g on g.lessonid=l.LessonID
inner join TBL_STUDENT s on s.STID=g.stid  ) as dep where dep.slno=1

首先为各个部门按降序创建rank()。然后选择相同的最高记录。

注意:使用RANK()DENSE_RANK(),两者都适用于前1条记录,而如果您想选择n最高成绩,则使用DENSE_RANK(),在最后一次slno通过n'th您要选择的记录。

答案 1 :(得分:0)

选择理论总是很困难,但是,尽管DarkRob的解决方案很好,但如果例如两个人最好的话,它将淘汰学生。这就是为什么我喜欢使用交叉应用的原因:

select
      d.Depname
    , s.StName
    , g.stgrade
from TBL_DEPARTMANTS d
inner join TBL_LESSONS l on
    d.DepID=l.LessonID
inner join TBL_GRADES g on
    g.lessonid=l.LessonID
inner join TBL_STUDENT s on
    s.STID=g.stid
cross apply (
    select
          sub_d.DepID
        , max(sub_g.stgrade) as maxgrade
    from TBL_DEPARTMANTS sub_d
    inner join TBL_LESSONS sub_l on
        sub_d.DepID=sub_l.LessonID
    inner join TBL_GRADES sub_g on
        sub_g.lessonid=sub_l.LessonID
    where sub_d.Dep_ID = d.Dep_ID
    group by sub_d.DepID
) as sub 
where g.stgrade = sub.maxgrade

这样,您将获得所有部门最高职位的员工,而不仅仅是一个。