***题解 | #统计复旦用户8月练题情况#难
统计复旦用户8月练题情况
https://www.nowcoder.com/practice/53235096538a456b9220fce120c062b3
# 现在运营想要了解复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况,请取出相应明细数据,对于在8月份没有练习过的用户,答题数结果返回0. # 需要判断月份 # 通过IF语句可以设置值 # 用SUM统计所有值 /* 解题思路 一看到这种题还是比较懵的,又是要分组,又是要判断,又要连接,还要进行日期判断 这时候第一步是要仔细读题,先分析可能出现的子句,和要用到的语句。 题目有要求统计没有答过题的用户,所有我们要以user_profile为主表来操作 对于本题来说,实现两表的连接是比较容易实现的, 然后是选择要使用的字段,与本题有关的字段包括,user_profile 的device_id,university ,和 question_practice_detail 的 question_id、result 和 date 先选好五个字段,然后对五个字段进行操作 1、用where字段 操作 WHERE t1.university = '复旦大学' 2、时间方面要注意 从题意“8月没有练习过的用户”可知没有答过题的也要统计, 3、但是没有答过题的在左连接下question_id为null 所以要加上 OR t2.date IS NULL 4、result字段是字符型的,题目要求统计回答正确的题数,直接计数肯定不行 所以用case 或者 if 函数转换一下,然后用求和函数统计,可以一并把null和 wrong值转换成0值 5、接下来就是统计题目数,和对答题结果求和 6、最后根据用户分一下组 */ SELECT t1.device_id, t1.university, count(t2.question_id) AS question_cnt, sum( case when t2.result = 'right' then 1 ELSE 0 end ) AS right_question_cnt FROM user_profile AS t1 LEFT JOIN question_practice_detail AS t2 ON t1.device_id = t2.device_id WHERE t1.university = '复旦大学' AND ((MONTH(t2.date)=8 OR t2.date IS NULL )) GROUP BY device_id ; SELECT up.device_id,up.university,SUM(IF(MONTH(date)=8,1,0)) AS question_cnt,SUM(IF(MONTH(date)=8 AND result='right',1,0)) AS right_question_cnt FROM user_profile up LEFT JOIN question_practice_detail qpd ON up.device_id = qpd.device_id WHERE university = '复旦大学' GROUP BY up.device_id; select a.device_id,university, # 8月练习的总题目数 又涉及到八月份没有练习过的用户 答题数返回0 sum(if(month(b.date)=8,1,0)) as question_cnt, # 回答正确的题目数情况 sum(if(month(b.date)=8 and result='right',1,0)) as right_question_cnt from user_profile a left join question_practice_detail b on a.device_id =b.device_id # 做左连接后,左表中可能有用户并没有做题 所以也没date没有result 注意再取空 where university='复旦大学' group by a.device_id;
SQL错题 文章被收录于专栏
每天学习一遍 刷题刷题 越刷越强!