平均值不起作用

MIS*_*Gem 0 sql-server t-sql cast decimal

我有一个不同报告周期的学生和成绩数据库。每个报告周期都有一个唯一的 ID,每个主题也有一个唯一的 ID。学生每个科目可以有不止一位老师,所以我需要平均给定的成绩,并只给出他们成绩的平均成绩。原始数据示例如下:

+--------------+------+-----+----+-------------+---+
| 223599152142 |   12 |  92 |  3 | Mathematics | 0 |
| 223599152142 |   12 |  92 |  3 | Mathematics | 3 |
| 223599152142 |   12 |  92 |  7 | History     | 3 |
| 223599152142 |   12 |  92 | 12 | Economics   | 3 |
| 223599152142 |   12 |  92 | 12 | Economics   | 4 |
| 223599152142 |   12 |  92 | 26 | Latin       | 2 |
| 223599152142 |   12 | 109 |  3 | Mathematics | 3 |
| 223599152142 |   12 | 109 |  3 | Mathematics | 4 |
| 223599152142 |   12 | 109 |  7 | History     | 3 |
| 223599152142 |   12 | 109 | 26 | Latin       | 2 |
| 223599152142 |   12 | 109 | 26 | Latin       | 3 |
| 223599152142 |   12 | 110 |  3 | Mathematics | 4 |
| 223599152142 |   12 | 110 |  7 | History     | 2 |
| 223599152142 |   12 | 110 |  7 | History     | 3 |
| 223599152142 |   12 | 110 | 26 | Latin       | 2 |
| 223599152142 |   12 | 110 | 26 | Latin       | 3 |
+--------------+------+-----+----+-------------+---+
Run Code Online (Sandbox Code Playgroud)

我希望根据每个 ReportCycleID 的 SubjectID 计算 GradeTransposeValue 的平均值,但得到的结果很奇怪。我已经设置了以下查询,只关注一名学生和一个报告周期来显示问题。

SELECT intSubjectID, txtCurrentSubjectReportName, 
       CAST(AVG(intGradeTransposeValue) AS decimal (5,2)) AS avg_attainment
FROM VwReportsManagementAcademicReports
WHERE intReportCycleAcademicYear = 2017 
     AND intNCYear >6 AND intGradeID = 1 
     AND txtSchoolID = 223599152142 
     AND intReportCycleID= 110
GROUP BY intSubjectID, txtCurrentSubjectReportName
Run Code Online (Sandbox Code Playgroud)

这正在产生这个结果

+--------------+-----------------------------+----------------+
| intSubjectID | txtCurrentSubjectReportName | avg_attainment |
+--------------+-----------------------------+----------------+
|            7 | History                     | 2.00           |
|           26 | Latin                       | 2.00           |
|            3 | Mathematics                 | 4.00           |
+--------------+-----------------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

但是,如果我们以拉丁语为例,原始值是 3 和 2,因此 3+2 = 5 / 2 应该 = 2.5 而不是 2。

对此的任何帮助将不胜感激。

Low*_*n M 9

您无法从一个INT值中获得比整数更高的精度。计算之前,您需要将它们设为小数:

CREATE TABLE [grades]
([intGradeTransposeValue]      INT,
 [txtCurrentSubjectReportName] NVARCHAR(50)
);

INSERT INTO [grades]
([intGradeTransposeValue],
 [txtCurrentSubjectReportName])
VALUES (2,'latin'), (3, 'latin');

--Returns whole number
SELECT AVG([intGradeTransposeValue])
FROM   [grades];

--Returns 2.5
SELECT AVG(CAST([intGradeTransposeValue] AS DECIMAL(5,2)))
FROM   [grades];
Run Code Online (Sandbox Code Playgroud)

理想情况下,您只需将成绩存储DECIMAL为开始时的值,但上述方法也适用于紧要关头。

  • @GDavies 那为什么它没有复选标记呢? (6认同)