最近,我遇到了SQL的SUM()
函数和GROUP BY
子句的问题。我想根据浮动值找到GPA(平均成绩点)。
以下是我目前使用的代码:
SELECT semesterid,
SUM( value ) AS TotalValue
FROM tbcourse
GROUP BY semesterid;
答案 0 :(得分:0)
如果value
是个别成绩点,则以下内容将为您提供semesterid
的每个值的GPA(平均成绩点)。
SELECT semesterid,
AVG( value ) AS TotalValue
FROM tbcourse
GROUP BY semesterid;
如果您有任何问题或意见,请随时发表评论。
答案 1 :(得分:0)
使用GROUP BY和SUM()聚合函数,你在正确的轨道上。但是,这里的部分原因是你需要为每个类获取数据(小时*点的产品),这些数据来自聚合。因此,您需要两个“查询步骤”,一个用于汇总分部的INPUT数据,然后用于计算“积分/学分时间”的步骤。
我对解决此类问题的建议是使用INNER QUERY。 基本上,您使用FROM(...)编写第二个“内部”查询,以使特定或自定义数据集从SELECT中生成。
那么这对您的问题意味着什么呢?
我不确定你的数据实际上是什么样的,所以我采取了一个刺,假设有两张桌子。既然你有一个学期的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()是加权平均值的特殊情况,其中所有元素(信用)的权重相同(不适用于具有不同信用小时数的类。< / p>