You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:54:41