SQL查询无主键Student表,筛选全科目均超50%学生的报错解决
问题原因
- 第一段报错SQL的错误:
GROUP BY语法要求SELECT返回的字段必须是分组维度,或者被聚合函数包裹,SELECT *不符合该语法要求,且逻辑上也没有实现「所有科目均达标才保留」的判断。 - 第二段调整后的SQL问题:仅过滤了单条低于50%的成绩记录,会保留存在不及格科目、但同时有及格科目的学生的及格记录,不符合需求。
实现思路
先按学号(Roll_Number)分组,筛选出**所有科目最低成绩百分比都≥50%**的学号列表,再用该列表匹配原表,返回对应学生的全部记录即可。
可用SQL代码
如果Percent字段为数值类型(40%存为0.4、60%存为0.6),使用以下写法:
-- 子查询写法 SELECT * INTO #temp1 FROM Student WHERE Roll_Number IN ( SELECT Roll_Number FROM Student GROUP BY Roll_Number HAVING MIN(Percent) >= 0.5 )
-- CTE写法,逻辑更清晰 WITH QualifiedStudents AS ( SELECT Roll_Number FROM Student GROUP BY Roll_Number HAVING MIN(Percent) >= 0.5 ) SELECT s.* INTO #temp1 FROM Student s JOIN QualifiedStudents q ON s.Roll_Number = q.Roll_Number
如果Percent字段是带%后缀的字符串类型,需要先做类型转换再比较,把MIN(Percent) >= 0.5替换为MIN(CAST(REPLACE(Percent, '%', '') AS DECIMAL)) >= 50即可。
结果验证
基于你提供的测试数据,仅学号为1231的Ishan没有低于50%的科目,最终会返回该学生的全部成绩记录,你给出的示例输出中学号写为1234属于笔误。
内容的提问来源于stack exchange,提问作者isha arora
相关产品推荐
相关产品推荐

