题解 | #统计复旦用户8月练题情况#
统计复旦用户8月练题情况
http://www.nowcoder.com/practice/53235096538a456b9220fce120c062b3
需求分解题解第一位的大佬已经说明了,我就不赘述了
这里想分析下我与他的不同点
select up.device_id, up.university,
sum(case when left(qpd.date,7)='2021-08' then 1 else 0 end) question_cnt,
sum(case when left(qpd.date,7)='2021-08' then (case when qpd.result='right' then 1 else 0 end) else 0 end) right_question_cnt
from user_profile up
left outer JOIN
question_practice_detail qpd
on up.device_id=qpd.device_id
where university='复旦大学'
group by up.device_id;
- 这里考虑到有同学可能在8月没有练习,使用 left outer join得出的结果是可能date 包含 NULL值, 然后因为聚合函数忽略NULL值, 考虑用Case when表达式转换NULL值 并求和
- 求解right_question_cnt 只需再嵌套一个Case when选出正确题目即可
- 这里group by 能写device_id而不报错的原因是, 在这个题目里, 学生与大学 一一对应(双学位背景下的题目就不成立了) 所以select子句能写聚合键device_id之外的 up.university
重点:
- NULL值处理