mysql中巧用if函数,根据平均分生成排行榜

前言

最近项目中遇到一个需求,学生家长对某个老师做了问卷调查,然后后台需要根据每个题目的分数,算出每个老师总分,以及多少个学生对老师进行了评分,进而算出平均分,以及百分率,最终确定排行榜。更多交流 join(“q_qun”,1071834648)

实现

需要用到的表如下
在这里插入图片描述
在这里插入图片描述
这里的需求是指定了题目的id 才会计算分数,计算分数为10-item_id ,如果item_id为0也就是第一个选项也就是10分,依次往后推。
这里数据字典是用代码生成的,下载可以到我上上传的资源里面去下载,也可以进入QQ群获取。
有人会说这有啥难度的,不就是sum求和嘛,有啥啊。刚开始我也这么想的,问题就在于他不是直接求和是有条件的才会相加,指定了某些题目才会计算,这就用到了if。
先看sql

select teacher,total_socre,total_student,CONCAT(round((total_socre/(total_student*60)),2)*100,'%') as prencent from 
(
SELECT
	teacher,sum(if((question_id in (41,42,43,44,45,48)),10-item_id,0)) as total_socre,count(DISTINCT(a.phone)) as total_student
FROM
	rms_captcha a,
	rms_exam b
WHERE
	a.phone = b.tel
GROUP BY teacher
)t order by (total_socre/total_student) desc

首先我们来看这if,sum里面的if的含义是,如果题目id在指定的需要计算分值的里面,那就给分值,分值的规则也就是10-item_id,如果不在就给0,这样子分数就统计出来了。因为在目前exam表中,一个学生的一次答题会生成很多条记录,统计学生人数就根据学生唯一标识手机号进行去重即可计算出学生的人数。因为本次统计时基于老师为维度统计的,因此还需要根据老师分组下。子查询就这么多。

外围的查询,就是对于子查询的统计和排序,需要注意的就是对于百分比的计算,要多留意一点。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

闲不住的程序员

您的打赏将是我最大的鼓励感谢

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

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

打赏作者

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

抵扣说明:

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

余额充值