Sql 同时使用group by和order by
我很难将order by函数与group by函数结合起来 我想找出三年中出勤率最高的学生 表: 学生Sql 同时使用group by和order by,sql,oracle,Sql,Oracle,我很难将order by函数与group by函数结合起来 我想找出三年中出勤率最高的学生 表: 学生 studentPIN | fName | lName | StudyYear 1 x x 1 2 x x 2 3 x x 3 4 x x 2 阿滕丹塞洛 注意状态是指他们是否
studentPIN | fName | lName | StudyYear
1 x x 1
2 x x 2
3 x x 3
4 x x 2
阿滕丹塞洛
注意状态是指他们是否参加了课程
ClassID | StudentPin | Status
12 1 NO
23 2 YES
34 3 YES
目前,我已经能够计算出每个学生上课的次数
这就是我目前正在处理的问题:
Select student.fname, student.lname, STUDENT.STUDYYEAR,
SUM(CASE ATTENDANCELOG.STATUS WHEN 'YES' THEN 1 ELSE NULL END) AS Attended
from student
Join ATTENDANCELOG on student.studentpin=ATTENDANCELOG.studentpin
GROUP BY STUDENT.STUDYYEAR, STUDENT.FNAME, STUDENT.LNAME
我只是被困在如何排序结果从最高出席率到最低,然后选择前一个为每3年
谢谢。使用行号()
尝试此操作后,如果所有措辞都正确,它只会提示存在无效标识符?您使用的是哪个版本的Oracle DB server?@Hilarion SQL Developer 18.1.0SQL Developer是用于访问DB server的客户端应用程序,而不是DB server本身。您可以尝试执行其中一个查询,以获取数据库服务器的版本号:SELECT*FROM PRODUCT\u COMPONENT\u version
或SELECT*FROM V$version
。
select fname, lname, studyyear, attended
from (select s.fname, s.lname, s.STUDYYEAR,
SUM(CASE al.STATUS WHEN 'YES' THEN 1 ELSE 0 END) AS Attended,
row_number() over (partition by s.studyyear
order by SUM(CASE al.STATUS WHEN 'YES' THEN 1 ELSE 0 END) desc
) as seqnum
from student s Join
ATTENDANCELOG al
on s.studentpin = al.studentpin
group by s.STUDYYEAR, s.FNAME, s.LNAME
) s
where seqnum = 1;
Select student.fname, student.lname, STUDENT.STUDYYEAR,
SUM(CASE ATTENDANCELOG.STATUS WHEN 'YES' THEN 1 ELSE NULL END) AS Attended
from student
Join ATTENDANCELOG on student.studentpin=ATTENDANCELOG.studentpin
GROUP BY STUDENT.STUDYYEAR, STUDENT.FNAME, STUDENT.LNAME
ORDER BY 4 desc;