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表中,一个学生的一次答题会生成很多条记录,统计学生人数就根据学生唯一标识手机号进行去重即可计算出学生的人数。因为本次统计时基于老师为维度统计的,因此还需要根据老师分组下。子查询就这么多。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章