【场景】:分别求count
【分类】:分组查询、多表连接
分析思路
难点: 1.分开求解 思路清晰,记得给用户去重
(1)统计出勤人数
-
[条件]:timestampdiff(minute,in_datetime,out_datetime) >= 10
-
[使用]:group by course_id;count(distinct user_id)记得对用户去重
(2)统计报名人数
- [使用]:ggroup by course_id; sum(if_sign)
(3)统计每个科目的出勤率,输出结果按course_id升序排序
- [使用]:round(expr,2); order by course_id
最终结果
select 查询结果 [课程号;课程名称;出勤率]
from 从哪张表中查询数据[多表]
order by 对查询结果排序 [按课程号升序排序];
求解代码
方法一
#出勤率=出勤(在线时长10分钟及以上)人数 / 报名人数
with
main as(
#统计出勤人数
select
course_id,
count(distinct user_id) as attend_number
from attend_tb
where timestampdiff(minute,in_datetime,out_datetime) >= 10
group by course_id
)
,attr as(
#统计报名人数
select
course_id,
sum(if_sign) as behavior_number
from behavior_tb
group by course_id
)
#统计每个科目的出勤率,输出结果按course_id升序排序
select
course_id,
course_name,
round(attend_number/behavior_number*100,2) as attend_rate
from course_tb
left join main using(course_id)
left join attr using(course_id)
order by course_id
方法二
多表连接
#请你统计每个科目的出勤率,输出结果按course_id升序排序
select
course_id,
course_name,
round(attend_number/behavior_number*100,2) as attend_rate
from course_tb
left join(
#统计出勤人数
select
course_id,
count(distinct user_id) as attend_number
from attend_tb
where timestampdiff(minute,in_datetime,out_datetime) >= 10
group by course_id
) main using(course_id)
left join(
#统计报名人数
select
course_id,
sum(if_sign) as behavior_number
from behavior_tb
group by course_id
) attr using(course_id)
order by course_id