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。
对此的任何帮助将不胜感激。
您无法从一个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为开始时的值,但上述方法也适用于紧要关头。
| 归档时间: |
|
| 查看次数: |
417 次 |
| 最近记录: |