SQL数学查询求助:查询2000年avg_math_4_score低于250的州报错
问题分析与修正方案
现有代码的错误点
- 逻辑错误1:CTE中
GROUP BY state后得到的AVG_STATES本来就是每个州2000年的平均数学成绩,但后续你用naep, AVR_ST做了无条件笛卡尔积,两张表没有关联条件,输出结果会完全混乱 - 逻辑错误2:筛选条件写反,需求是找平均成绩低于250的州,你写的
250 < AVG_STATES实际是筛选平均成绩高于250的州 - 语法错误:你给出的报错信息里
AVG()是空参数,说明你实际执行的代码漏了给avg函数传入要计算的字段,和你贴出的代码不一致,PostgreSQL不支持无参数的avg函数 - 冗余逻辑:不需要额外关联原naep表,CTE里已经包含了计算需要的所有维度
正确写法
不需要写得过于复杂,直接按州分组筛选即可:
SELECT state AS below_250 FROM naep WHERE year = '2000' GROUP BY state HAVING AVG(avg_math_4_score) < 250;
如果要保留CTE的写法,修正后如下:
WITH AVR_ST AS ( SELECT state, avg(avg_math_4_score) AS AVG_STATES FROM naep WHERE year = '2000' GROUP BY state ) SELECT state AS below_250 FROM AVR_ST WHERE AVG_STATES < 250;
写法说明
- 先筛选出2000年的所有记录,按州分组计算每个州的
avg_math_4_score平均值 - 用HAVING子句对分组后的聚合结果做筛选,只保留平均值低于250的州
- 直接返回州名并将别名设置为
below_250即可,不需要额外加DISTINCT,因为GROUP BY已经保证每个州只有一条记录
内容的提问来源于stack exchange,提问作者Maria Varges
相关产品推荐
相关产品推荐

