SQL AVG AND JOIN ORACLE

时间:2018-02-21 08:06:30

标签: sql oracle join average

我有以下任务:找到平均成绩大于所有成绩平均水平的学生(所有学生的所有成绩都在同一栏目中)。此外,我必须从另一张桌子上得到他的名字。

第一个表格如下:

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代码并给我一个解释你在过程中的想法吗?先感谢您。

4 个答案:

答案 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);

这是https://demo.vaadin.com/dashboard/

答案 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