解题思路

  • 一看到这种题还是比较懵的,又是要分组,又是要判断,又要连接,还要进行日期判断
  • 这时候第一步是要仔细读题,先分析可能出现的子句,和要用到的语句。
  • 题目有要求统计没有答过题的用户,所有我们要以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
;