[英]Sum then divide with group by query in SQL database
最近,我SUM()
了SUM()
函数和SQL的GROUP BY
子句的问题。 我想根据浮动值找到GPA(平均绩点)。
以下是到目前为止我一直在使用的代码:
SELECT semesterid,
SUM( value ) AS TotalValue
FROM tbcourse
GROUP BY semesterid;
如果value
是各个成绩点,则以下内容将为您提供每个semesterid
值的GPA(平均成绩点)。
SELECT semesterid,
AVG( value ) AS TotalValue
FROM tbcourse
GROUP BY semesterid;
如果您有任何问题或意见,请随时发表评论。
使用GROUP BY和SUM()聚合函数可以使您处于正确的轨道。 但是,这里技巧的一部分是您需要获取每个类的数据(小时*点的乘积),这些数据是从聚合中获取的。 因此,您需要两个“查询步骤”,一个步骤是汇总除法的INPUT数据,然后是计算“点/学分”的步骤。
我对解决此类问题的建议是使用内部查询。 基本上,您使用FROM(...)编写第二个“内部”查询,以生成一组特定的或自定义的数据以供SELECT选择。
那么,这对您的问题意味着什么呢?
我不确定您的数据实际上是什么样子,所以我尝试了一下并假设有两个表。 由于您有一个学期的ID和课程(我也假设有ID),因此我认为这意味着您至少拥有这些ID。 我假设了一些简单的表结构,这是在我的建议下针对您的情况所做的工作:
学期表
CREATE TABLE semesters (
id INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY,
term_name VARCHAR(256) NOT NULL,
term_year INT(8) NOT NULL
);
课程表
CREATE TABLE courses (
id INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(256) NOT NULL,
semester_id INT(12) NOT NULL,
credit_hours INT(4) NOT NULL,
grade FLOAT,
FOREIGN KEY (semester_id) REFERENCES semesters(id)
);
查询1 ::每个学期的GROUP BY以查看每个学期的GPA
SELECT
sg.semester_id AS "Semester"
,sg.grade_points AS GPs
,sg.hours AS hours
,ROUND((sg.grade_points / sg.hours), 2) AS GPA
FROM (
SELECT
c.semester_id AS semester_id
,SUM(c.credit_hours + 0.0) AS hours
,SUM((c.grade * c.credit_hours) + 0.0) AS grade_points
FROM courses AS c
GROUP BY c.semester_id
) as sg # sg ~ SemesterGrades;
查询2 ::#查询2-所有学期的总和以获得(加权)累积GPA
SELECT
ROUND((grades.grade_points / grades.hours), 2) AS GPA
FROM (
SELECT
c.semester_id AS semester_id
,SUM(c.credit_hours + 0.0) AS hours
,SUM((c.grade * c.credit_hours) + 0.0) AS grade_points
FROM courses AS c
) as grades
我还编写了一个SQL-Fiddle,以便您可以解决此问题,并且,如果需要,可以更改表结构并尝试进行更多查询以使其正确。 另外,如果我没有回答您的问题,请随时寻求更多帮助! 希望能帮助到你。
http://sqlfiddle.com/#!9/2b0693
更新我不认为使用AVG()解决此问题是正确的。 原因是GPA计算值不是“标准”平均值-而是加权平均值。 换句话说,AVG()是加权平均值的特例 ,其中所有元素(学分)的权重都相同(不适用于学分小时数不同的班级)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.