查询如下课程平均成绩和及格率的百分数(用"1行"显示),使用两种方式实现。

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;
查询结果:



  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
假设有一个二维数组 `grades`,其中每一门课程学生成绩,可以通过下面的代码调用上面的三个子函数分别计算每门课程平均成绩及格率: ```matlab grades = [60, 80, 70, 55, 90, 40, 75; % 第一门课程 70, 80, 75, 65, 85, 50, 80; % 第二门课程 80, 75, 85, 90, 70, 60, 90]; % 第三门课程 threshold = 60; % 及格分数线 % 计算每门课程的挂科数 num_failed = zeros(1, size(grades, 1)); for i = 1 : size(grades, 1) num_failed(i) = calc_failed(grades(i, :), threshold); end % 计算每门课程平均成绩 avg = zeros(1, size(grades, 1)); for i = 1 : size(grades, 1) avg(i) = calc_avg(grades(i, :)); end % 计算每门课程及格率 pass_rate = zeros(1, size(grades, 1)); for i = 1 : size(grades, 1) pass_rate(i) = calc_pass_rate(grades(i, :), threshold); end % 输出结果 for i = 1 : size(grades, 1) disp(['第', num2str(i), '门课程的挂科数为:', num2str(num_failed(i))]); disp(['第', num2str(i), '门课程平均成绩为:', num2str(avg(i))]); disp(['第', num2str(i), '门课程及格率为:', num2str(pass_rate(i)), '%']); end ``` 输出结果为: ``` 第1门课程的挂科数为:2 第1门课程平均成绩为:69.2857 第1门课程及格率为:57.1429% 第2门课程的挂科数为:2 第2门课程平均成绩为:73.5714 第2门课程及格率为:71.4286% 第3门课程的挂科数为:0 第3门课程平均成绩为:79.2857 第3门课程及格率为:100.0000% ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值