(牛客网SQL入门)SQL34 统计复旦用户8月练题情况

题目链接:统计复旦用户8月练题情况_牛客题霸_牛客网 

--初版代码
select  up.device_id,

        university,

        count(qpd.device_id) as question_cnt,

        sum(case when qpd.result = 'right' then 1 else 0 end) as right_question_cnt

     from user_profile up left join question_practice_detail qpd

      on up.device_id = qpd.device_id

     where university = '复旦大学' and (month(date) = 8 or date is null)

     group by up.device_id,university;

--优化后代码
select  up.device_id,

        '复旦大学',

        count(qpd.device_id) as question_cnt,

        sum(case when qpd.result = 'right' then 1 else 0 end) as right_question_cnt

     from user_profile up left join question_practice_detail qpd

      on up.device_id = qpd.device_id and month(qpd.date) = 8

     where university = '复旦大学' 

     group by up.device_id
上述代码是我写的SQL语句(初版),我说一下自己的解题思路:

1、首先要熟悉所给两个表中的内容和逻辑,结合两个表读题发现需要进行表连接,连接条件就是两个表中的device_id,于是我把两个表连接到一块去查看它显示出来的内容,观察表数据并结合最后题目所给结果发现如果使用内连接的话,不会显示全部数据,不符合题目要求,所以需要用到左右外连接,我选择了左连接(左连接和内连接的区别我下面列出);

2、表连接完成后就需要加筛选条件了,于是where后面我加了两个条件,发现还是显示不全,意识到where是先连接后筛选,那么月份如果加到这里我的左连接岂不是白用了嘛,脑子没转过来,所以我直接把代码写死,就有了 month(date) = 8 or date is null , (之后优化了代码才有了新版本);

3、接下来就考虑分组了,因为需要显示每个用户的一个汇总信息,需要对用户分组,那么既然题目要求我显示一个university的字段,我就做了复合分组,当然也可以直接增加一个写死的列,个人感觉这块还是不写死的好;

4、第一个字段和第二个字段都显示成功了,接下来就是信息的一个汇总了,要计算用户在8月份练习的总题目数,个人感觉此处的逻辑没有表达清楚,带入现实中,我8月份刷23考研数学真题卷中的最后一道答题,我刷了5次,就隔着一道题狂刷,这到底是应该记录为刷了一道题还是五道题呢?(好像怎么理解都有道理哈),那最后肯定是要呈现出题目所给的结果,所以他题目中要表达的逻辑就是不去重,无论刷的题是不是同一道,都要记录;

5、那最后一个字段就最简单了,就是显示做对的题目数量,累加里面套了循环,我用的case when ,当然也可以用if,根据个人习惯写就好,如果该字段中值为right,那就返回1,否则返回0,循环走完,通过sum累加起来(使用case when要注意,要加else,不然就会显示null)。

总结:这道题我感觉是不难的,还是需要把逻辑理清,一步一步写SQL语句,不能着急,我一开始的时候就是着急,要么少些一个字母,要么条件加错位置,细心一点多做题就好了。
内连接和左连接的区别(右连接同理):内连接是将两个表通过连接条件连在一起,只显示两个表中符合连接条件的数据,左连接就是将left join 左边的那个表作为主表,left join 右边的那个表作为次表,主表的内容全部显示,次表只显示符合连接条件的数据,不符合连接条件的显示为空。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值