MySQL--关于MySQL练习过程中遇到的AVG()函数处理空值的问题

最近正准备面试,所以本来不怎么熟悉的SQL语句迫切需要练习,学习一下

在此感谢 笨鸟先飞-天道酬勤 大佬的博客:https://blog.csdn.net/dehu_zhou/article/details/52881587

在题17:按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

SELECT a.*
	,SUM(CASE WHEN b.Cid=‘01‘ THEN b.score ELSE 0 END) AS s01
	,SUM(CASE WHEN b.Cid=‘02‘ THEN b.score ELSE 0 END) AS s02
	,SUM(CASE WHEN b.Cid=‘03‘ THEN b.score ELSE 0 END) AS s03
	,AVG(ifnull(b.score,0)) as  avs
FROM Student a
LEFT JOIN SC b
ON a.Sid=b.Sid
GROUP BY 1,2,3,4
ORDER BY avs DESC ;

最终的结果如下:

在这里感觉到了疑惑,为啥07的平均成绩没有计算s01这个值呢,导致最终结果与我想的不符(按3取平均值)

百思不得其解

后来感谢群内大佬的解答

原因在于:

  AVG()函数统计的是表中的数据,对于SC表而言,需要计算的score值只有2个,所以即便在后续的join语句中,产生了null值,并置为0.在这里也是按SC表中的2个数值计算,而非3个数值;

解决办法:

  方法1:再套一层查询,将结果作为临时表,对临时表字段进行统计

select t.*, round((s01+s02+s03)/3,2) as avs from (
SELECT a.*
	,SUM(CASE WHEN b.Cid=‘01‘ THEN b.score ELSE 0 END) AS s01
	,SUM(CASE WHEN b.Cid=‘02‘ THEN b.score ELSE 0 END) AS s02
	,SUM(CASE WHEN b.Cid=‘03‘ THEN b.score ELSE 0 END) AS s03
FROM Student a
LEFT JOIN SC b
ON a.Sid=b.Sid
GROUP BY 1,2,3,4
) t ORDER BY avs desc;

  返回结果:

  方法2:根据课程表,补全课程信息

select * from Student t
LEFT JOIN (
	select a.Sid
		,max(case when a.Cid=‘01‘ THEN a.score ELSE 0 END) as s01
		,max(case when a.Cid=‘02‘ THEN a.score ELSE 0 END) as s02
		,max(case when a.Cid=‘03‘ THEN a.score ELSE 0 END) as s03
		,round(avg(case when a.score is null then 0 else a.score end),2) as avs
	from SC a group BY a.Sid ) t1
on t.Sid = t1.Sid
;

  返回结果:

原文地址:https://www.cnblogs.com/wyf-349/p/11655647.html

时间: 2024-08-04 15:18:35

MySQL--关于MySQL练习过程中遇到的AVG()函数处理空值的问题的相关文章

百度地图 在加载过程中,根据回调函数结果中第一个点设置为中心点

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script&g

MySQL 5.7 安装过程中遇到的坑

在安装的过程中遇到了几个坑,特地记录下来.启动的时候会有有个错误: 大意为mysql退出且更新不了pid文件. 查看error.log,如图: 大意为ibdtata1文件不够,初始化的时候页数太大.初步判断为配置文件的配置参数问题. 将其改小或注释后解决. 初始化命令: bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/data         # Before MySQL 5.6 bin

Mysql: Connect/C++ 使用过程中发现返回 std::string 造成的内存泄露

在使用 Connect/C++ ,测试时发现在调用 getString 出现了内存增长的情况. ConstructOutput(); //打印出当前内存 for(int i=0;i<1000;++i) { prepareState.reset(con->prepareStatement("call test.testproc3(?)")); prepareState->setInt(1,1001); prepareState->executeUpdate();

DFU工作过程中USB机制

在一级bootloader运行进入USB启动方式之后,设备进行枚举.枚举过程中会通过PC端发送命令对连接的USB设备进行枚举.当枚举成功之后,在PC端能够看到设备的盘符. 当设备能够被PC正确识别之后,接下来就可以通过烧写工具完成设备的扫描如果成功找到设备,则可以通过USB传输数据到SRAM中,这时候的数据主要包括2k infor文件.一级bootloader在成功的解析2kinfor 之后,PC端会将DFU文件传输到初始化好的DRAM中.并且PC指针跳转到DFU地址处执行,执行过程中会跳转到U

lua解析脚本过程中的关键数据结构介绍

在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.lobject.h和lopcode.h. 在llex.h中 1 typedef struct Token { 2 int token; 3 SemInfo seminfo; 4 } Token; Token代表了一个词法单元,其中token表示词法类型如TK_NAME.TK_NUMBER等如果不是这些

MySQL集群架构以及本人配置过程中出现的问题及解决办法

首先说下MySQL的优缺点 优点 解决单点故障 自动实现数据冗余 缺点就是维护起来太麻烦. 集群的条件就是所有的机器上都要安装MySQL的集群软件,我安装的是MySQL-Cluster-gpl-7.3.5-1.el6.x86_64.rpm的rpm包,不是源码包安装.如果系统里面安装了mysql-server等数据库服务软件的要自行写在掉即可. MySQL集群中有三种角色,下面是三种角色以及其的作用 角色 数据节点:ndbd节点 存储在表里的数据(表中的记录) SQL节点:不存储数据,供用户访问和

WINDOWS系统下MYSQL安装过程中的注意事项

1.首先MySQL的安装方式有两种:一种是MSI安装方式,很简单就像安装Windows软件一样.另外一种就是ZIP安装方式.这种相对而言比较麻烦.新手推荐MSI安装方式. 安装方式有以下两种: MSI的安装包方式(相对简单):ZIP安装方式 选择安装类型:(推荐选择Typical 典型安装方式) Typical:典型安装 Custom:自定义安装 Complete:完全安装 2.MySQL配置 详细配置 detailed configuration 标准配置 standard configura

Ubuntu14.04安装mysql及过程中遇到的一点小问题

Ubuntu14.04出来有段时间了,前几天刚升级到这个版本,新鲜了一把.不过安装mysql时遇到了一点小问题,记录一下以备后用. 预备操作: 网上安装mysql的方法不少,大体有这么三种. 1. 从网上安装 sudo apt-get install mysql-server.装完已经自动配置好环境变量,可以直接使用mysql的命令. 2. 安装离线包,以mysql-5.0.45-linux-i686-icc-glibc23.tar.gz为例. 3. 二进制包安装:安装完成已经自动配置好环境变量

linux安装和配置 mysql、redis 过程中遇到的问题记录(转)

章节目录 mysql redis linux下部署mysql和redis网上的教程很多,这里记录一下我部署.配置的过程中遇到的一些问题和解决办法. mysql ①安装完成后启动的时候报错 Starting MySQL.The server quit without updating PID file 干掉/etc/my.cnf 就好了 原因是: mysql_safe 下指定的  /var/run/mariadb 和 /var/log/mariadb 不存在 也可以选择新建这两个目录 ②安装好之后