SQL计算回合平均得分时如何将缺失参赛记录计为0?
解决方案:计算包含未参与回合玩家的平均得分
要实现把未参与对应回合的玩家得分算作0再计算平均,核心是先构建所有玩家与所有回合的完整组合,再关联原数据填充得分(空值替换为0),最后计算平均值。以下是适用于Exasol和MySQL的通用方案:
完整SQL代码
SELECT all_combinations.Round, AVG(COALESCE(r.Points, 0)) AS avg_points FROM -- 生成所有玩家与所有回合的笛卡尔积 (SELECT DISTINCT Player FROM results) AS all_players CROSS JOIN (SELECT DISTINCT Round FROM results) AS all_rounds AS all_combinations -- 左连接原表,匹配已有得分记录 LEFT JOIN results r ON all_combinations.Player = r.Player AND all_combinations.Round = r.Round GROUP BY all_combinations.Round ORDER BY all_combinations.Round;
代码说明
- 构建全量组合:通过
CROSS JOIN将所有唯一玩家和所有唯一回合进行交叉关联,确保每个玩家在每一个回合都有一条记录,不管是否实际参与。 - 填充0分:用
COALESCE(r.Points, 0)把左连接后没有匹配到得分的记录(即玩家未参与该回合)的得分替换为0。 - 计算平均:按回合分组后,对填充后的得分计算平均值,此时的平均就包含了未参与玩家的0分。
测试结果验证
针对你提供的测试数据,执行后会得到如下结果:
| Round | avg_points |
|---|---|
| 1 | 2.0 |
| 2 | 2.0 |
| 3 | 5.0 |
| 4 | 5.0 |
完全符合要求的计算逻辑。
内容的提问来源于stack exchange,提问作者krausinski
相关产品推荐
相关产品推荐

