SQLPLUS - 根据每门课程的成绩、总学分和每门课程的学分计算每个学生的 GPA
Posted
技术标签:
【中文标题】SQLPLUS - 根据每门课程的成绩、总学分和每门课程的学分计算每个学生的 GPA【英文标题】:SQLPLUS - Calculating GPA for each student in, given their grade on each course, total credit hours, and credit hours for each course 【发布时间】:2019-02-27 01:06:25 【问题描述】:我有这些表格(删除了一些信息,因为它与我的问题无关)
课程(course_id,学分) 学生(student_id, total_credits) 参加(course_id、student_id、成绩) grade_point(等级,分数)我需要找到每个学生的 gpa。这是加权gpa,这意味着公式将是
sum(points * 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,因为我还不熟悉它。此外,因为这是一个家庭作业问题,我更喜欢提示而不是实际解决方案。谢谢!
【问题讨论】:
我希望你不介意我在这里发表评论以帮助你this post you just unhappily deleted。--我不明白你认为对此的回应是不合理的,我们指出了阻止我们的错别字从回答它开始,我解释说,您似乎希望我们在可以检查时重做您的所有工作,等等。您为什么不改正错别字,展示您的工作并解释您卡在哪里?我们愿意为您提供帮助。 哦,我想你是被我的 cmets re “我认为是”冒犯了。看——我真的只是想通过指出一个常见的无益和阻碍思考/写作的习惯来帮助你提高解决问题的能力。我会找到更好的沟通方式。 【参考方案1】:您正在使用 聚合 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
s 而不是隐式语法(即在FROM
子句中用逗号分隔的表名和WHERE
子句中的连接条件)。我以这种方式修改了您的查询。
使用表别名也是一个好主意:它使查询更具可读性,并且通常可以避免名称冲突。
【讨论】:
我假设sqlplus中不允许使用表别名。 另外,这给了我一个错误,与我在问题中提到的相同:ORA-00979: not a GROUP BY expression
它指向s.total_credits
@pinklemonade :对不起,我忘了将该列添加到GROUP BY
子句中,刚刚更新了我的答案。 PS:似乎现在正在理解GROUP BY
逻辑!
啊!为什么你还必须按学分分组?我不确定我是否理解。是不是因为虽然它是 GPA 属性的一部分,但它不是聚合函数的一部分?
没错。 SELECT 子句中且不属于聚合函数(SUM() 或 else)的每一列都必须出现在 GROUP BY 子句中。以上是关于SQLPLUS - 根据每门课程的成绩、总学分和每门课程的学分计算每个学生的 GPA的主要内容,如果未能解决你的问题,请参考以下文章