我有以下任务:找到平均成绩大于所有成绩平均水平的学生(所有学生的所有成绩都在同一栏目中)。此外,我必须从另一张桌子上得到他的名字。
第一个表格如下:
Student_ID GRADE Course_Name
50 10 Math
60 9 Math
100 10 Math
200 7 Math
50 8 Sport
100 7 Sport
依旧......
在第二个表中:
Student_ID Name
50 JHON
60 Mark
100 FIONA
200 ROBERT
我按照我应该做的事情的顺序把我的头绑起来。你能帮助我使用sql oracle代码并给我一个解释你在过程中的想法吗?先感谢您。
答案 0 :(得分:2)
以下是使用分析函数的选项:
SELECT t.*
FROM
(
SELECT s.*, g.*,
AVG(g.GRADE) OVER (PARTITION BY s.Student_ID) avg_s,
AVG(g.GRADE) OVER () avg_all
FROM students s
LEFT JOIN grades g
ON s.student_ID = g.student_ID
) t
WHERE avg_s > avg_all
编辑:
如果您只想报告每个符合成绩标准的学生,您可以尝试在外部选择中执行SELECT DISTINCT Name
。
答案 1 :(得分:1)
一个解决方案是
select s.student_id, s.name, avg(g.grade)
from grades g
inner join students s on s.student_id = g.student_id
group by s.student_id, s.name
having avg(g.grade) > (select avg(grade) from grades)
答案 2 :(得分:1)
要获得每个学生的平均成绩,请加入两个表和GROUP BY学生ID和姓名。要获得所有等级的平均值,您需要单独的查询,因为它是一个不同的qranularity。您可以将其用作GROUP BY的HAVING子句中的子查询。
select g.student_id
, s.name
, avg(g.grade) as student_avg
from grades g
join students s
on g.student_id = s.student_id
group by g.student_id, s.name
having avg(g.grade) > ( select avg(grade) from grades);
答案 3 :(得分:0)
关于思考过程:
首先,您需要意识到名称对于任务并不重要,您可以将它们作为最后一步的平均计算结果加入。所以关注那一个。
SELECT name, avg_grade
FROM ( <query to get the averages> ) q
JOIN students ON q.student_id = name_table.student_id
其次,所有等级的平均值只是一个数字,它可以在WHERE或HAVING条件下进入子选择。它也只是
SELECT AVG(grade) from grades
第三,你需要每个学生的平均成绩。这可以通过GROUP BY来实现。
SELECT student_id, AVG(grade)
FROM grades
GROUP BY student_id
将所有事物捆绑在一起:
SELECT name, avg_grade
FROM (
SELECT student_id, AVG(grade) as avg_grade
FROM grades
GROUP BY student_id
HAVING AVG(grade) > (SELECT AVG(grade) from grades)
) q
JOIN students ON q.student_id = name_table.student_id