select
    u.device_id,
    u.university,
    count(qpd.question_id) as question_cnt,
    sum(case when qpd.result='right' then 1 else 0 end) as right_question_cnt
from
    user_profile u
left join
    question_practice_detail qpd
on
    u.device_id=qpd.device_id
    and month(qpd.date)=8
where
    u.university='复旦大学'
group by
    u.device_id,u.university;
  1. select u.device_id, u.university, count(qpd.question_id) as question_cnt, sum(case when qpd.result='right' then 1 else 0 end) as right_question_cnt:选择要查询的列,包括用户设备 ID、大学名称,统计用户回答问题的总数question_cnt,以及回答正确的问题总数right_question_cnt。其中right_question_cnt通过case语句判断回答结果是否为right,如果是则记为 1,否则为 0,最后求和得到。
  2. from user_profile u left join question_practice_detail qpd on u.device_id=qpd.device_id and month(qpd.date)=8:指定从user_profile表(别名为u)和question_practice_detail表(别名为qpd)进行数据获取,通过left join连接这两张表,连接条件是用户设备 ID 相等且答题日期的月份为 8 月。
  3. where u.university='复旦大学':筛选出大学为 “复旦大学” 的用户数据。
  4. group by u.device_id,u.university:按照用户设备 ID 和大学名称进行分组,以确保每个用户(按设备 ID 区分且同一大学)的数据统计是独立的。