首页 > 数据库技术 > 详细

sql 语句系列(加减乘除与平均)[八百章之第十四章]

时间:2020-04-03 01:10:49      阅读:79      评论:0      收藏:0      [点我收藏+]

avg的注意事项

一张t2表:
select * from t2
技术分享图片

select AVG(sal) from t2

得到的结果是:
技术分享图片

本来我们得到的结果应该是10的。但是得到的结果确实15.

这是因为忽略了null值。

解决方案:
当为空的时候转换为0

select AVG(coalesce(sal,0)) from t2

max 与 min的注意事项

max与min会忽略null,但是如果全是null的情况,会返回null值。

select DEPTNO,max(COMM)
from EMP
where DEPTNO in (10,30)
group by DEPTNO 

例如:
技术分享图片

解决方法:
如上文

select DEPTNO,max(coalesce(COMM,0))
from EMP
where DEPTNO in (10,30)
group by DEPTNO 

sum

sum 计算的时候会忽略null值。
如上:
解决:

select DEPTNO,sum(coalesce(COMM,0))
from EMP
where DEPTNO in (10,30)
group by DEPTNO 

计算行数

通常我们计算行数,通常是使用count。

同样是会忽略null值:

select COUNT(*),count(COMM)
from EMP

技术分享图片

累计和

要实现下面这种效果:

技术分享图片
比如2600,是红框部分的和。

假设前两列的效果是:

select e.EMPNO, e.SAL
from EMP e
order by 1

要求写出第三列的效果。

答案:

select e.EMPNO, e.SAL,(select SUM(d.SAL) from EMP d where d.EMPNO<=e.EMPNO) as total
from EMP e
order by 3

累计乘

如何实现累计乘法?
有一个数学概念:

技术分享图片

技术分享图片

select e.EMPNO, e.SAL,(select  exp(sum(log(d.SAL))) from EMP d where d.EMPNO<=e.EMPNO and d.DEPTNO=e.DEPTNO ) as total
from EMP e
where DEPTNO=10
order by 3

累计差

分情况讨论,当是第一个直接输出第一个。后面的就是全部是负值相加然后加两个EMPNO最小值。

select e.EMPNO, e.SAL,(select  case when e.EMPNO=MIN(d.EMPNO) then sum(d.SAL) 
else sum(-d.SAL)+(select f.SAL from emp f where f.EMPNO=MIN(d.EMPNO))*2 
end from EMP d where d.EMPNO<=e.EMPNO and d.DEPTNO=e.DEPTNO ) as total
from EMP e
where DEPTNO=10
order by EMPNO

技术分享图片

sql 语句系列(加减乘除与平均)[八百章之第十四章]

原文:https://www.cnblogs.com/aoximin/p/12617032.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!