Sql 小组练习
我有以下数据库: ProfBadge、profName、部门 CoursecourseCod、courseName、profBadge、area 课程代码、日期、课程代码、学生人数 以及以下要求: 对于每个只在该地区开设课程的教授,数据库会显示徽章编号和平均学生人数最高的课程Sql 小组练习,sql,oracle,subquery,oracle-sqldeveloper,Sql,Oracle,Subquery,Oracle Sqldeveloper,我有以下数据库: ProfBadge、profName、部门 CoursecourseCod、courseName、profBadge、area 课程代码、日期、课程代码、学生人数 以及以下要求: 对于每个只在该地区开设课程的教授,数据库会显示徽章编号和平均学生人数最高的课程 Create view badgeList(profBadge, courseCod) as SELECT DISTINCT profBadge, courseCod FROM Coure WHERE (profBadge
Create view badgeList(profBadge, courseCod) as
SELECT DISTINCT profBadge, courseCod
FROM Coure
WHERE (profBadge NOT IN (SELECT profBadge
FROM Course
WHERE Area <> 'database'));
Create view avgLessons(AvgStud, courseCod) as
SELECT AVG(numberOfStudents), courseCod
FROM class
GROUP BY courseCod;
Create view MaxStudent(maxStu, profBadge) as
select max(med.avgStud), el.profBadge
from avgLessons med, badgeList el
where med.courseCod= el.courseCod
group by el.profBadge;
select DISTINCT MS.profBadge, MS.MAXSTU, Corso.CODCORSO
from MaxStudent MS, course, class
where MS.profBadge = course.profBadge and MS.maxStu = class.numberOfStudents and course.courseCod = class.courseCod;`
我不知道我是否看到了您想要实现的目标,但下面的代码返回profBadges,并且仅返回那些通过所属班级数量计算平均学生人数最高的课程名称
SELECT profBadge,
courseName
FROM
(SELECT C.profBadge,
C.courseName,
SUM(CL.numberOfStudents) /COUNT(CL.classCode) AS Avg_Students_Num,
ROW_NUMBER () OVER (PARTITION BY C.profBadge ORDER BY SUM(CL.numberOfStudents)/COUNT(CL.classCode)) AS Rank
FROM Course C
LEFT JOIN Class CL
ON CL.courseCod=C.courseCod
GROUP BY C.courseName,
C.profBadge
)
WHERE Rank=1
这不是一项容易的任务。如前所述,一步一步地进行 第1步:教授只在“数据库”领域开设课程。使用NOT IN是解决此问题的一种方法。另一个通常也是最快的是聚合
SELECT profBadge
FROM Course
GROUP BY profBadge
HAVING MIN(Area) = 'database' AND MAX(Area) = 'database';
第二步:每门课程的平均学生人数,如你所示
SELECT courseCod, AVG(numberOfStudents)
FROM class
GROUP BY courseCod;
第三步:将两者结合起来。您可以选择profBadge位于步骤1的第一个集合查询中的课程,并根据您必须加入步骤2的查询的平均学生人数对其进行排名
SELECT courseCod, courseName, profBadge, area
FROM
(
SELECT
c.courseCod, c.courseName, c.profBadge, c.area,
RANK() OVER (PARTION BY c.profBadge ORDER BY av.avgNum DESC) AS rn
FROM Course c
JOIN
(
SELECT courseCod, AVG(numberOfStudents) AS avgNum
FROM class
GROUP BY courseCod
) av ON av.courseCod = c.courseCod
WHERE c.profBadge IN
(
SELECT profBadge
FROM Course
GROUP BY profBadge
HAVING MIN(Area) = 'database' AND MAX(Area) = 'database'
)
)
WHERE rn = 1;
把它分解成几个部分。首先,你如何找到平均学生人数最多的课程?那么,如何将其连接回数据集,并显示“数据库”课程的徽章和课程编号?但如果我发现课程编号最高,我是否会丢失其他课程的信息?我需要找到每个教授的平均学生人数最多的课程,因此在计算中,请在profbadge上包含一组学生。并使用徽章和课程加入。我试图避免的是为你写答案,而是引导你采取步骤,尝试让你自己找到解决方案/尝试。那位老人教一个人吃一辈子的鱼,给他们一条鱼吃一天。不要把整头大象都吃掉,一次只咬一口,看看它是如何结合在一起的。把复杂的事情分解成组成部分就变得简单了,当你把组件放回去的时候,它就不再复杂了。一步一步地做。第一步:找到只在该领域开设课程的教授。考虑一种方法。遇到问题时请返回。上次查询不起作用。您获得了每门课程的平均学生人数,例如12.5,并获得了每位教授的最大人数。但这并不一定与班级相匹配。当然是学生人数。你必须加入对抗阿夫格尔森的队伍,而不是班级。你不能只对付只有“数据库”区域的教授。