SQL进阶day12——空值处理

1 统计有未完成状态的试卷的未完成数和未完成率

(复习if的用法)

我的思路:

复制代码
select exam_idm
count(if submit_time is NULL then 1 else 0 end) incomplete_cnt,
count(if submit_time is NULL then 1 else 0 end)/count(submit_time) complete_rate
from exam_record
group by id

报错好像是因为(if submit_time is NULL then 1 else 0 end)不对。

查询改正:

复制代码
select exam_id,
sum(if (submit_time is NULL,1,0)) incomplete_cnt,
count(if (submit_time is NULL,1,0))/count(submit_time) complete_rate
from exam_record
group by id

正确答案:

复制代码
select exam_id,
sum(if (submit_time is NULL,1,0)) incomplete_cnt,
round(avg(if (submit_time is NULL,1,0)),3) complete_rate
from exam_record
group by exam_id
having complete_rate != 0

复盘:

(1)【条件判断函数】------根据满足不同条件,执行相应流程(用法不要搞混啦!)
● if(expr,v1,v2)

如果表达式expr是true返回值v1,否则返回v2

例如:if(1<2,'Y','N')返回Y,if(1>2,'Y','N')返回N if后面要加括号!!!!
● case when

case expr when v1 then r1 [when v2 then r2] ...[else rn] end

例如:case 2 when 1 then 'one' when 2 then 'two' else 'more' end 返回two

case后面的值为2,与第二条分支语句when后面的值相等相等,因此返回two

(2)是按照exam_id进行分组,统计有未完成状态的试卷的,是基于试卷来的。

2 0级用户高难度试卷的平均用时和平均得分

我的代码:

复制代码
#2、再筛选出试卷------difficulty = hard
select uid,
round(avg((if(score is NULL,0,score))),0) avg_score,
avg(if(submit_time is NULL,ei.duration,timestampdiff(minute,submit_time,start_time))) avg_time_took
from exam_record er join examination_info ei
on er.exam_id = ei.exam_id
where uid in  #1、先筛选出用户------level=0
(select uid from user_info
where level = 0)
and ei.difficulty = 'hard'
group by er.uid,er.exam_id
# 未完成的默认试卷最大考试时长
# if(submit_time is NULL,ei.duration,timestampdiff(minute,submit_time,start_time))

# 未完成的默认0分处理
# if(score is NULL,0,score)

答案错误原因:

复制代码
# 未完成的默认试卷最大考试时长
# if(submit_time is NULL,ei.duration,timestampdiff(minute,submit_time,start_time))

改正:

时间差函数:timestampdiff,如计算差多少分钟

timestampdiff(minute,时间1,时间2),是时间2-时间1。

复制代码
# 未完成的默认试卷最大考试时长
# if(submit_time is NULL,ei.duration,timestampdiff(minute,start_time,submit_time))

题目是要求:请输出每个0级用户所有的(..)试卷,所以是直接按照用户分组就好,

不要group by er.uid,er.exam_id

正确答案:

复制代码
#2、再筛选出试卷------difficulty = hard
select uid,
round(avg((if(score is NULL,0,score))),0) avg_score,
round(avg(if(submit_time is NULL,ei.duration,timestampdiff(minute,start_time,submit_time))),1) avg_time_took
from exam_record er join examination_info ei
on er.exam_id = ei.exam_id
where uid in  #1、先筛选出用户------level=0
(select uid from user_info
where level = 0)
and ei.difficulty = 'hard'
group by er.uid
# 未完成的默认试卷最大考试时长
# if(submit_time is NULL,ei.duration,timestampdiff(minute,start_time,submit_time))

# 未完成的默认0分处理
# if(score is NULL,0,score)
相关推荐
('-')几秒前
《从根上理解MySQL是怎样运行的》第十二章学习笔记
笔记·学习·mysql
Boop_wu16 分钟前
[Java EE] 多线程编程进阶
java·数据库·java-ee
用户414292960723921 分钟前
批量商品信息采集工具获取商品详情的完整方案
爬虫·数据挖掘·数据分析
深瞳智检39 分钟前
学习应用 第001期-Windows 10 用 CMD 安装 MySQL 全流程解析(免安装版)
数据库·windows·mysql·压缩包·环境安装
用户41429296072391 小时前
淘宝实时商品API接口:采集竞品商品详情页的价格、SKU 规格、库存数量、卖点文案、图文内容、售后政策(运费、退换货规则)、评价核心标签
数据挖掘·数据分析·数据可视化
正在走向自律1 小时前
金仓数据库在发电行业的创新应用与实战案例
数据库·国产数据库·电力·kingbasees·电科金仓
华纳云IDC服务商1 小时前
MySQL数据库如何防止SQL注入攻击
数据库·sql·mysql
合作小小程序员小小店1 小时前
桌面开发,在线%物品代送,代接管理%系统,基于vs2022,c#,winform,sql server数据。
开发语言·数据库·sql·microsoft·c#
疏狂难除1 小时前
尝试rust与python的混合编程(二)
数据库·python·rust