GROUP BY子句报错:按Condicion分组时Cantidad列不符合聚合规则
问题分析与解决方案
报错原因
你执行的select * from exercisepractice GROUP by Condicion违反了SQL分组规则:当使用GROUP BY时,SELECT列表中的所有非聚合列必须出现在GROUP BY子句中。你这里SELECT了Cantidad和Sexo,但只按Condicion分组,数据库无法确定同一Condicion下多个Cantidad、Sexo值该返回哪一个,因此触发报错。
你的SQL代码问题
- 视图定义冗余:视图里重复了两次
Aprobados的查询和两次Desaprobados(还存在拼写错误Desprobados)的查询,会导致视图结果出现重复行,完全没必要。 - 后续分组操作多余:你的预期结果是按
Condicion和Sexo分组的统计,实际上视图本身可以直接生成该结果,不需要额外再执行分组操作。
修正后的SQL代码
第一步:修正视图创建语句
去掉重复的UNION ALL分支,统一拼写Desaprobados:
create view exercisepractice as -- 统计男、女性的Aprobados数量 select 'Aprobados' as Condicion, sum(case when Promedio>13.5 then 1 else 0 end) as Cantidad, A.Sexo from vAlumnos A inner join vMatricula M on A.CodAlumno=M.CodAlumno inner join vNotas N on M.NroMatricula=N.NroMatricula where N.SemAcademico='2020-I' GROUP BY A.Sexo union all -- 统计男、女性的Desaprobados数量 select 'Desaprobados' as Condicion, sum(case when Promedio<13.5 then 1 else 0 end) as Cantidad, A.Sexo from vAlumnos A inner join vMatricula M on A.CodAlumno=M.CodAlumno inner join vNotas N on M.NroMatricula=N.NroMatricula where N.SemAcademico='2020-I' GROUP BY A.Sexo;
第二步:直接查询视图得到预期结果
无需额外分组,直接执行:
select * from exercisepractice;
即可得到你想要的结果:
| CONDICION | CANTIDAD | SEXO |
|---|---|---|
| Aprobados | XXXX | M |
| Aprobados | XXXX | F |
| Desaprobados | XXXX | M |
| Desaprobados | XXXX | F |
额外优化(可选)
可以用更简洁的方式生成结果,一次查询完成统计,避免重复的JOIN逻辑:
create view exercisepractice as select case when Promedio>13.5 then 'Aprobados' else 'Desaprobados' end as Condicion, count(*) as Cantidad, A.Sexo from vAlumnos A inner join vMatricula M on A.CodAlumno=M.CodAlumno inner join vNotas N on M.NroMatricula=N.NroMatricula where N.SemAcademico='2020-I' and Promedio != 13.5 -- 若需排除刚好13.5的情况可保留,否则删除 group by A.Sexo, case when Promedio>13.5 then 'Aprobados' else 'Desaprobados' end;
内容的提问来源于stack exchange,提问作者SchneiderJinn
相关产品推荐
相关产品推荐

