题解 | #统计复旦用户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;
  1. 这里考虑到有同学可能在8月没有练习,使用 left outer join得出的结果是可能date 包含 NULL值, 然后因为聚合函数忽略NULL值, 考虑用Case when表达式转换NULL值 并求和
  2. 求解right_question_cnt 只需再嵌套一个Case when选出正确题目即可
  3. 这里group by 能写device_id而不报错的原因是, 在这个题目里, 学生与大学 一一对应(双学位背景下的题目就不成立了) 所以select子句能写聚合键device_id之外的 up.university

重点:

  1. NULL值处理
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-16 18:03
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务