SQL Server中如何计算两列数据的平均值?
问题分析与修正方案
你的原查询存在两个关键问题:
AVG(tblWinds.Repertoire AND tblWinds.Performance)逻辑错误:AND是布尔运算符,会将列值转换为0或1后计算平均,完全不符合两列数值求平均的需求。GROUP BY包含了tblWinds.Performance,这会导致分组粒度过细,每个不同的Performance值都会单独成组,无法得到你预期的聚合结果。
以下是两种常见场景的修正代码:
场景1:计算每行两列的平均值,再对结果分组求平均
如果需要先算出每一条记录里Repertoire和Performance的平均值,再按学校和曲目分组计算整体平均,使用以下语句:
SELECT tblSchools.SchoolID, tblSchools.SchoolName, tblWinds.MusicDescription, AVG( (tblWinds.Repertoire + tblWinds.Performance) / 2.0 ) AS AvgScore FROM tblSchools INNER JOIN tblWinds ON tblSchools.SchoolID = tblWinds.SchoolID WHERE SchoolName = 'school' GROUP BY tblSchools.SchoolID, tblSchools.SchoolName, tblWinds.MusicDescription ORDER BY tblSchools.SchoolID ASC
注意用2.0而非2,避免SQL Server的整数除法导致结果被取整。
场景2:先分别求两列的分组平均值,再计算这两个平均值的平均
如果需要先得到Repertoire列的分组平均、Performance列的分组平均,再取这两个值的平均,使用以下语句:
SELECT tblSchools.SchoolID, tblSchools.SchoolName, tblWinds.MusicDescription, ( AVG(tblWinds.Repertoire) + AVG(tblWinds.Performance) ) / 2.0 AS AvgScore FROM tblSchools INNER JOIN tblWinds ON tblSchools.SchoolID = tblWinds.SchoolID WHERE SchoolName = 'school' GROUP BY tblSchools.SchoolID, tblSchools.SchoolName, tblWinds.MusicDescription ORDER BY tblSchools.SchoolID ASC
额外优化建议
- 替换旧式的逗号连接表写法为
INNER JOIN,让查询逻辑更清晰易读。 - 确保
Repertoire和Performance列是数值类型(如int、decimal),否则需要先做类型转换(比如用CAST(col AS DECIMAL(10,2)))再进行计算。
内容的提问来源于stack exchange,提问作者cube901
相关产品推荐
相关产品推荐

