SQLPLUS - 计算每个学生的 GPA,给定他们每门课程的成绩、总学分和每门课程的学分
SQLPLUS - Calculating GPA for each student in, given their grade on each course, total credit hours, and credit hours for each course
我有这些表格(删除了一些与我的问题无关的信息)
- 课程(course_id,学分)
- 学生(student_id,total_credits)
- 参加(course_id、student_id、成绩)
- grade_point(成绩,分数)
我需要找到每个学生的 gpa。这是加权gpa,这意味着公式将是
sum(点 * course.credits) / 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,因为我还不熟悉它。另外,因为这是一个家庭作业问题,所以我更喜欢提示而不是实际的解决方案。谢谢!
您正在使用 聚合 SQL 查询,其中结果按学生分组。您需要向 Oracle 表明这一点,方法是在查询中添加 GROUP BY
子句:
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
而不是隐式语法(即 table 名称在 FROM
子句和连接条件中用逗号分隔在 WHERE
子句中)。我这样修改了你的查询。
使用 table 别名也是一个好主意:它使查询更具可读性,并且通常可以避免名称冲突。
我有这些表格(删除了一些与我的问题无关的信息)
- 课程(course_id,学分)
- 学生(student_id,total_credits)
- 参加(course_id、student_id、成绩)
- grade_point(成绩,分数)
我需要找到每个学生的 gpa。这是加权gpa,这意味着公式将是
sum(点 * course.credits) / 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,因为我还不熟悉它。另外,因为这是一个家庭作业问题,所以我更喜欢提示而不是实际的解决方案。谢谢!
您正在使用 聚合 SQL 查询,其中结果按学生分组。您需要向 Oracle 表明这一点,方法是在查询中添加 GROUP BY
子句:
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
而不是隐式语法(即 table 名称在 FROM
子句和连接条件中用逗号分隔在 WHERE
子句中)。我这样修改了你的查询。
使用 table 别名也是一个好主意:它使查询更具可读性,并且通常可以避免名称冲突。