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

CS50 SQL:Moneyball问题9.sql查询未通过校验的原因咨询

解决MLB 2001年球队平均薪资查询报错问题

常见错误原因及修正方案

你的查询逻辑方向正确,但报错通常来自细节问题,这里给出修正后的完整查询及关键说明:

SELECT 
    t.name AS team_name,
    ROUND(AVG(s.salary), 2) AS average_salary
FROM 
    salaries s
INNER JOIN 
    teams t ON s.team_id = t.team_id
WHERE 
    s.year = 2001
GROUP BY 
    t.team_id, t.name
ORDER BY 
    average_salary ASC
LIMIT 5;

关键修正点

  1. GROUP BY 兼容性处理
    多数现代数据库(如开启ONLY_FULL_GROUP_BY的MySQL、PostgreSQL)要求GROUP BY子句包含所有非聚合的SELECT字段。仅按t.name分组既可能触发语法报错,还可能因不同team_id对应同名球队的极端情况导致聚合数据错误。同时按t.team_id和t.name分组既符合SQL规范,又保证数据准确性。

  2. 表关联逻辑优化
    使用INNER JOIN明确关联逻辑,确保仅返回2001年有薪资记录的球队,避免出现平均薪资为NULL的无效行。若需包含无薪资数据的球队,可改用LEFT JOIN,但需注意AVG会自动忽略NULL值,此类球队的平均薪资会显示为NULL。

  3. 字段筛选准确性
    明确指定s.year = 2001,确保筛选的是薪资记录所属的2001年,而非球队表中无关年份的数据。

额外排查项

  • 确认字段匹配:检查两个表的team_id字段类型是否一致(如均为INT),salary字段是否为数值类型(避免AVG计算失败)。
  • 处理NULL薪资:若salary字段存在NULL值,可改用ROUND(AVG(COALESCE(s.salary, 0)), 2)将NULL转为0后再计算平均值。
  • 数据库语法适配:如果使用SQL Server,需将LIMIT 5替换为TOP 5;Oracle则需用FETCH FIRST 5 ROWS ONLY。

内容的提问来源于stack exchange,提问作者Nidhi Priya Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:42:07