select tb1.course_id, course_name, round(count(tb2.user_id)/count(tb1.user_id)*100,2) from (select user_id, course_id from behavior_tb where if_sign=1) tb1 left join (select distinct user_id, course_id, if(timestampdiff(second,in_datetime,out_datetime)/60>=10,1,0) if_in from attend_tb where hour(out_datetime)>=19) tb2 on tb1.user_id=tb2.user_id and tb1.course_id=tb2.course_id and tb2.if_in=1 left join course_tb tb3 on tb1.course_id=tb3.course_id group by tb1.course_id, course_name order by tb1.course_id #思路:报名表计算报名人数,出勤表计算出勤人数,最后分组聚合计算出勤率。 #①报名人数及if_sign=1的人,选出后形成tb1; #②出勤人数即进出时间间隔≥600秒的人(有些人多次进出用distinct去重),给出勤人打个标签为1,其余为0,形成tb2; #③tb1左联tb2再左联科目表,分组聚合计算即可。