【场景】:分别求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