最近在《sql cookbook》书上发现了名叫
分析函数
的东西,之前学 oracle 时没有印象,现在感觉其分析函数的功能相当强大、神奇,
就特意去找到了 chm 文档研究了一下,想要的朋友在本文末尾自行下载。
本文的例子都来源于 chm 文档,本人只是执行了这些 sql,看着结果理解分析函数的功能用途,并对分析函数做了注释,方便后面查看理解。
请各位读者结合 chm 中的例子一起食用,更好理解消化。
1、分组求和:GROUP BY子句
具体 sql 实例我就不贴了,具体请查看chm 分析函数 6.00
分别执行以下 sql ,对比它们执行后的结果:
--原:这是我们大家都知道的 group by() 函数
select id,area,stu_type,sum(score) score
from students
group by id,area,stu_type
order by id,area,stu_type;
--A、GROUPING SETS
select id,area,stu_type,sum(score) score
from students
group by grouping sets((id,area,stu_type),(id,area),id)
order by id,area,stu_type;
--B、ROLLUP
select id,area,stu_type,sum(score) score
from students
group by rollup(id,area,stu_type)
order by id,area,stu_type;
--C、CUBE
select id,area,stu_type,sum(score) score
from students
group by cube(id,area,stu_type)
order by id,area,stu_type;
下面是这四条语句分别执行后的结果
注:1)每个函数都是在原来的基础上增加了功能,对不同分组条件的求和;
2)对函数的理解自行看结果对比理解,鄙人暂时没想到合适的语言解释。
2、连续求和:sum(...) over(...)
具体实例看 chm 文档 6.01
使用 sum(sal) over (order by ename)... 查询员工的薪水“连续”求和,注意over (order by ename);
如果没有order by 子句,求和就不是“连续”的,放在一起,体会一下不同之处:
select deptno,ename,sal,
sum(sal) over (order by ename) 连续求和,
sum(sal) over () 总和, -- 此处sum(sal) over () 等同于sum(sal)
100*round(sal/sum(sal) over (),4) "份额(%)"
from emp
以下是执行结果,由于内置的表数据可能不一样,每个人的结果不一定一样,但效果是一样的
从结果可以看出,这里的连续求和的意思是把当前行的数据与之前所有数据相加求和作为该行的和
------------------------------------------------------------------------------------------------------------------------------------------------
使用子分区查出各部门薪水连续的总和。注意按部门分区。注意over(...)条件的不同,
sum(sal) over (partition by deptno order by ename) 按部门“连续”求总和
sum(sal) over (partition by deptno) 按部门求总和
sum(sal) over (order by deptno,ename) 不按部门“连续”求总和
sum(sal) over () 不按部门,求所有员工总和,效果等同于sum(sal)
还是贴一下执行结果更方便理解吧
partition 是划分、分割、区分的意思,partition by 类似于 group by
这里的功能就是按部门分区,在每个部门内部做连续求和
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
注意:在"... from emp;"后面不要加order by 子句,使用的分析函数的(partition by deptno order by sal)里已经有排序的语句了,
如果再在句尾添加排序子句,一致倒罢了,不一致,结果就令人费劲了。
附:该安装包包含以下文档
点击下载http://download.csdn.net/download/alias_fa/10162035
1.首先创建一个表createtableTE(IDVARCHAR2(2),T_CODEVARCHAR2(4),T_NAMEVARCHAR2(4),T_AMOUNTINTEGER,T_DEPTVARCHAR2(4),T_PROJECTVARCHAR2(4),T_TYPEVARCHAR2(1))2.录入数据如下:insertintote(...
对于编程人员的我们来说,写sql应该是不可避免的,要写sql,那么group by肯定也就再熟悉不过了,over可能用的也不少。无论是取最大值或
求和
等操作,我们一般都会用到这些语句,既然是如此常用的语句,那我们就一起来看看它的一些用法吧。
知识无极限,与你来相见,欢迎点赞支持!
文章目录1 场景1.1 概念1.2 思维导图1.3 数据准备2 知识点小结2.1 group by2.2 grouping sets:单独
分组
2.3 rollup:累计累加2.4 cube(交叉列表)2.6 grouping2.7 grouping_id1 场景内容修改中,请稍等… 1.1 概念rollup,cube,grouping sets
函数
可以理解为 group by
分组
函数
封装后的...
select '1001' group1, 'a' group2, 'Y' group3, 1 num from dual
union all
select '1001' group1, 'a' group2, 'N' group3, 2 num from dual
union all
select...
SQL code--创建测试表mytestcreate table mytest(id number,pro_name varchar(20),cast number)--插入数据insert into mytest values(1,'lass',100)insert into mytest values(1,'tass',200)insert into mytest values(1,'sas...
在
Oracle
中,命令和对象名称都是大小写不敏感的,因为
Oracle
在处理语句时,将所有的名称和命令全部转化为大写。
但是对于字符串中的字符,无论是比较还是排序,都是大小写敏感的。这在
Oracle
是默认方式,但不是唯一的方式。...
数据
分组
是通过使用GROUP BY子句、
分组
函数
以及HAVING子句共同实现。☆
分组
函数
MAX 求最大值 SELECT max(sal),min(sal) FROM emp;MIN 求最小值 SELECT avg(sal),sum(sal) FROM emp;AVG 求平均值 SELECT AVG(sal) FROM sal;SUM
求和
SELECT SUM(sal) FROM sal;COUN...