(复习if的用法)

我的思路:
- select exam_idm
- count(if submit_time is NULL then 1 else 0 end) incomplete_cnt,
- count(if submit_time is NULL then 1 else 0 end)/count(submit_time) complete_rate
- from exam_record
- group by id
报错好像是因为(if submit_time is NULL then 1 else 0 end)不对。
查询改正:
- select exam_id,
- sum(if (submit_time is NULL,1,0)) incomplete_cnt,
- count(if (submit_time is NULL,1,0))/count(submit_time) complete_rate
- from exam_record
- group by id
正确答案:
- select exam_id,
- sum(if (submit_time is NULL,1,0)) incomplete_cnt,
- round(avg(if (submit_time is NULL,1,0)),3) complete_rate
- from exam_record
- group by exam_id
- having complete_rate != 0
复盘:
(1)【条件判断函数】——根据满足不同条件,执行相应流程(用法不要搞混啦!)
● if(expr,v1,v2)
如果表达式expr是true返回值v1,否则返回v2
例如:if(1<2,'Y','N')返回Y,if(1>2,'Y','N')返回N if后面要加括号!!!!
● case when
case expr when v1 then r1 [when v2 then r2] ...[else rn] end
例如:case 2 when 1 then 'one' when 2 then 'two' else 'more' end 返回two
case后面的值为2,与第二条分支语句when后面的值相等相等,因此返回two
(2)是按照exam_id进行分组,统计有未完成状态的试卷的,是基于试卷来的。
我的代码:
- #2、再筛选出试卷——difficulty = hard
- select uid,
- round(avg((if(score is NULL,0,score))),0) avg_score,
- avg(if(submit_time is NULL,ei.duration,timestampdiff(minute,submit_time,start_time))) avg_time_took
- from exam_record er join examination_info ei
- on er.exam_id = ei.exam_id
- where uid in #1、先筛选出用户——level=0
- (select uid from user_info
- where level = 0)
- and ei.difficulty = 'hard'
- group by er.uid,er.exam_id
- # 未完成的默认试卷最大考试时长
- # if(submit_time is NULL,ei.duration,timestampdiff(minute,submit_time,start_time))
-
- # 未完成的默认0分处理
- # if(score is NULL,0,score)
答案错误原因:
- # 未完成的默认试卷最大考试时长
- # if(submit_time is NULL,ei.duration,timestampdiff(minute,submit_time,start_time))
改正:
时间差函数:timestampdiff,如计算差多少分钟
timestampdiff(minute,时间1,时间2),是时间2-时间1。
- # 未完成的默认试卷最大考试时长
- # if(submit_time is NULL,ei.duration,timestampdiff(minute,start_time,submit_time))
题目是要求:请输出每个0级用户所有的(..)试卷,所以是直接按照用户分组就好,
不要group by er.uid,er.exam_id

正确答案:
- #2、再筛选出试卷——difficulty = hard
- select uid,
- round(avg((if(score is NULL,0,score))),0) avg_score,
- round(avg(if(submit_time is NULL,ei.duration,timestampdiff(minute,start_time,submit_time))),1) avg_time_took
- from exam_record er join examination_info ei
- on er.exam_id = ei.exam_id
- where uid in #1、先筛选出用户——level=0
- (select uid from user_info
- where level = 0)
- and ei.difficulty = 'hard'
- group by er.uid
- # 未完成的默认试卷最大考试时长
- # if(submit_time is NULL,ei.duration,timestampdiff(minute,start_time,submit_time))
-
- # 未完成的默认0分处理
- # if(score is NULL,0,score)