题解 | #统计复旦用户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部分

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务