题解 | #统计复旦用户8月练题情况#
统计复旦用户8月练题情况
https://www.nowcoder.com/practice/53235096538a456b9220fce120c062b3
SELECT u.device_id, u.university, COUNT(CASE WHEN q.question_id THEN 1 ELSE NULL END) question_cnt, SUM(CASE WHEN q.result = 'right' THEN 1 ELSE 0 END) right_question_cnt FROM user_profile u LEFT JOIN question_practice_detail q ON u.device_id = q.device_id WHERE u.university = '复旦大学 ' AND (q.date BETWEEN '2021-08-01' AND '2021-08-31' OR q.date IS NULL) GROUP BY u.device_id, u.university
题解:
1.目标是练题情况,具体是练题数和正确数,使用聚合函数
2.限制条件:八月,复旦学生,使用wher或者having
思路:
1.因为有些学生肯定不答题,所以用左连接,学生表是主表
2.过滤条件先选择复旦的,然后选择八月的,这里在日期还加了个NULL是因为上面学生不答题,没有日期,不然我聚合没结果(倒腾了半天)
3.使用COUNT和SUM聚合函数,和CASE WHEN语句
4.最后使用分组语句,要注意分组的语句必须是查询中的所有非聚合函数的部分
- 在
SELECT
子句中,您可以包含非聚合字段和聚合字段。 - 在
GROUP BY
子句中,您只应该包含非聚合字段。
再尝试优化下right_question_cnt部分