方法一
--- 明细层完成计算,然后再计算所有数值 select uid,round(SUM(score)/count(exam_id),0) avg_score,ROUND(SUM(timezone)/count(exam_id),1) avg_time_took from ( select a.uid,a.exam_id,start_time,submit_time,timestampdiff(minute,start_time,submit_time),duration, case when a.submit_time is null then duration when timestampdiff(minute,start_time,submit_time)<=duration then timestampdiff(minute,start_time,submit_time) when timestampdiff(minute,start_time,submit_time)>=duration then duration end timezone, score from exam_record a left join user_info b on a.uid=b.uid left join examination_info c on a.exam_id=c.exam_id where `level`=0 and difficulty='hard' ) t group by uid
方法二
coalesce 支持多个参数
coalesce(A,B).
A不为null,先返回A,
A为null,返回B
a,B都是null,返回null
select uid,round(SUM(score)/count(exam_id),0) avg_score,ROUND(SUM(timezone)/count(exam_id),1) avg_time_took from ( select a.uid,a.exam_id,start_time,submit_time,timestampdiff(minute,start_time,submit_time),duration, COALESCE(TIMESTAMPDIFF(minute,start_time,submit_time),duration) timezone, score from exam_record a left join user_info b on a.uid=b.uid left join examination_info c on a.exam_id=c.exam_id where `level`=0 and difficulty='hard' ) t group by uid
方法三
if
select uid,round(SUM(score)/count(exam_id),0) avg_score,ROUND(SUM(timezone)/count(exam_id),1) avg_time_took from ( select a.uid,a.exam_id,start_time,submit_time,timestampdiff(minute,start_time,submit_time),duration, if(submit_time is null,duration,timestampdiff(minute,start_time,submit_time) ) timezone, score from exam_record a left join user_info b on a.uid=b.uid left join examination_info c on a.exam_id=c.exam_id where `level`=0 and difficulty='hard' ) t group by uid