查询如下课程平均成绩和及格率的百分数(用"1行"显示),使用两种方式实现。
2016-11-30 01:58
609 查看
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;查询结果:
第一种为传统的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;查询结果:
相关文章推荐
- 解决ea【syui 中显示Date类型数据为[object Object]】两种方式:手动实现+JSON.toJSONStringWithDateFormat(obj,"farmat")
- MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)
- 用一条SQL语句 查询出每门课程都大于80分的学生姓名" 的实现方式
- MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
- mysql查询成绩排名显示-两种排名方式
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
- 改写:C#里根据Windows本地用户组查询组成员,以及修改密码(System.DirectoryServices.Protocols使用"WinNT://"方式)
- mysql查询成绩排名显示-两种排名方式
- 按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
- 查询成绩>=该课程平均成绩的信息,并按格式输出
- 关于"优先使用时间上较早获得的积分"的实现思路
- 不要在DEBUG模式下使用STL实现"复杂的"算法
- linq 实现查询字符串拼接 : And 和 OR 两种方式
- 使用"函数递归"实现的树型菜单
- 利用5个标签,4个文本框,2个按钮,自己设计布局实现输入三边求三角形面积。界面如下所示。三角形类的编写可以使用实验4中已经写过的三角形类,当点击“判断三边”时,若能构成三角形,在标签5上显示“可以构成三角形!”,如不能构成三角形,在标签5上显示“不能构成三
- 已知某个学习小组3门课程的成绩如表,使用二维数组存放该学习小组的3门成绩,计算每个学生的平均成绩和该小组每门课程的平均成绩
- 统计查询-根据条件进行count的两种实现方式- oracle
- oledb {"操作必须使用一个可更新的查询。"} 解决
- Access update语句 提示 "操作必须使用一个可更新的查询"Access update语句 提示 "操作必须使用一个可更新的查询"