1.查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),UML (003)
第一种为传统的case when使用方式:
select
sum(case when sc.cid=001 then sc.score else 0 end)/sum(case when sc.cid=001 then 1 else 0 end) as 企业管理平均成绩,
100*sum(case when sc.cid=001 and nvl(sc.score,0)>=60 then 1 else 0 end)/sum(case when sc.cid=001 then 1 else 0 end)||'%'as 企业管理及格率,
sum(case when sc.cid=002 then sc.score else 0 end)/sum(case when sc.cid=002 then 1 else 0 end) as 马克思平均成绩,
100*sum(case when sc.cid=002 and nvl(sc.score,0)>=60 then 1 else 0 end)/sum(case when sc.cid=002 then 1 else 0 end)||'%'as 马克思及格率,
sum(case when sc.cid=003 then sc.score else 0 end)/sum(case when sc.cid=003 then 1 else 0 end) as UML平均成绩,
100*sum(case when sc.cid=003 and nvl(sc.score,0)>=60 then 1 else 0 end)/sum(case when sc.cid=003 then 1 else 0 end)||'%'as UML及格率
from sc
查询结果:
第二种为:根据课程id扩展成绩表字段,让每一列只展示一门学科的成绩,方便使用sum和count函数(向省掉一些重复代码,实际上额外增加了其它代码,姑且一看吧)
select
sum(sc2.企业管理成绩)/count(sc2.企业管理成绩) as 企业管理平均成绩,
100*sum(case when sc2.企业管理成绩>=60 then 1 else 0 end)/count(sc2.企业管理成绩)||'%' as 企业管理及格率,
sum(sc2.马克思成绩)/count(sc2.马克思成绩) as 马克思平均成绩,
100*sum(case when sc2.马克思成绩>=60 then 1 else 0 end)/count(sc2.马克思成绩)||'%' as 马克思及格率,
sum(sc2.UMl成绩)/count(sc2.UMl成绩) as UML平均成绩,
100*sum(case when sc2.UMl成绩>=60 then 1 else 0 end)/count(sc2.UMl成绩)||'%' as UML及格率
from (
select
(case when sc.cid=001 then sc.score else null end)企业管理成绩,
(case when sc.cid=002 then sc.score else null end)马克思成绩,
(case when sc.cid=003 then sc.score else null end)UMl成绩
from sc
)sc2;
查询结果: