***题解 | #统计复旦用户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错题 文章被收录于专栏

每天学习一遍 刷题刷题 越刷越强!

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务