我有这些表格(一些信息与我的问题无关,因此已删除)
,我需要为每个学生找到gpa。是加权的gpa,这意味着公式将是
总和(积分*课程。学分)/ total_credits
目前,我正在努力告诉SQL如何为每个学生计算这个。我写的查询是这样的:
SELECT student.student_id, (sum(grade_point.points * course.credits) /
student.total_credits) AS GPA
FROM student, course, takes, grade_point
WHERE grade_point.grade = takes.grade
AND takes.course_id = course.course_id
AND student.student_id = takes.student_id;
但是,正如预期的那样,我收到有关需要GROUP BY
的错误。我知道如果使用聚合函数,则需要使用GROUP BY,但是我不确定将其分组的依据。
我读到您必须将不在聚合函数中的SELECT
表达式添加到GROUP BY
,但是如果这样做,我会得到一个ORA-00979: not a GROUP BY expression
我想避免使用PL / SQL,因为我对此还不熟悉。另外,因为这是一个家庭作业问题,所以我建议使用提示而不是实际的解决方案。谢谢!
答案 0 :(得分:0)
您使用的是汇总 SQL查询,其中结果按学生分组。您需要通过向查询添加GROUP BY
子句来向Oracle指出这一点:
SELECT
s.student_id,
(SUM(gp.points * c.credits) / s.total_credits) AS GPA
FROM
student
INNER JOIN takes t ON s.student_id = t.student_id
INNER JOIN course c ON t.course_id = c.course_id
INNER JOIN grade_point gp ON gp.grade = t.grade
GROUP BY s.student_id, s.total_credits
另一个好的SQL惯例是使用显式JOIN
而不是隐式语法(即,表名在FROM
子句中用逗号分隔,在WHERE
子句中用联接条件分隔)。我以这种方式修改了您的查询。
使用表别名也是一个好主意:它使查询更具可读性,并且通常避免名称冲突。