然后在SQL数据库中通过查询分组

时间:2017-05-24 02:01:27

标签: c# sql sql-server

最近,我遇到了SQL的SUM()函数和GROUP BY子句的问题。我想根据浮动值找到GPA(平均成绩点)。

以下是我目前使用的代码:

SELECT semesterid,
       SUM( value ) AS TotalValue
FROM tbcourse
GROUP BY semesterid;

2 个答案:

答案 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>