oracle分析函数系列之sum(col1) over(partition by col2 order by col3):实现分组汇总或递增汇总 .

语法:sum(col1) over(partition by col2 order by col3 )

 准备数据:

   DEPT_ID      ENAME                   SAL
1  1000            A                    2500
2  1000            B                    3500
3  1000            C                    1500
4  1000            D                    2000
5  2000            E                    2500
6  2000            F                    2000
7  2000            G                    3500

主要有四种情况:

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)。

 

1.有partition by有order by :   在partition by分组下,按照不同的order by col3实现递增汇总..    

SQL>>select DEPT_ID,ENAME,SAL,sum(SAL) over(partition by dept_id order by ENAME) AS TOTAL  from  dept_sal  

结果:按照部门分组,按名字排序实现递增汇总.       

DEPT_ID     ENAME       SAL     TOTAL

1 1000       A          3500    3500
2 1000       B          3500    7000
3 1000       C          1500    8500
4 1000       D          2000    10500
5 2000       E          2500    2500
6 2000       F          2000    4500
7 2000       G          3500    8000       

如果col3重复会只加总一次(当然在本例中这种写法毫无意义):

SQL>> select DEPT_ID,ENAME,SAL,sum(SAL) over(partition by dept_id order by SAL) AS TOTAL from dept_sal     

  DEPT_ID  ENAME    SAL   TOTAL

1 1000       C      1500  1500
2 1000       D      2000  3500
3 1000       A      3500  10500
4 1000       B      3500  10500
5 2000       F      2000  2000
6 2000       E      2500  4500
7 2000       G      3500  8000

 

2.有partition by无order by:  实现分组内所有数据的汇总

SQL>>select DEPT_ID,ENAME,SAL,sum(SAL) over(partition by dept_id) AS TOTAL from dept_sal     

DEPT_ID   ENAME    SAL   TOTAL
1 1000 	A 	3500 	10500
2 1000 	B 	3500 	10500
3 1000 	C 	1500   10500
4 1000 	D 	2000 	10500
5 2000 	E 	2500 	8000
6 2000 	F 	2000 	8000
7 2000 	G 	3500 	8000

 

 3.无partition by有order by : 直接按order by 字段实现递增汇总

SQL>>select DEPT_ID,ENAME,SAL,sum(SAL) over(order by ENAME) AS TOTAL from dept_sal

  DEPT_ID    ENAME     SAL    TOTAL
1 1000 	       A 	    3500   3500
2 1000          B      3500   7000
3 1000          C      1500   8500
4 1000          D      2000   10500
5 2000          E      2500   13000
6 2000          F      2000   15000
7 2000          G      3500   18500

如果order by 的值相同,会进行汇总,但汇总后显示的值会是一样的,如下:

SQL>>select DEPT_ID,ENAME,SAL,sum(SAL) over(order by DEPT_ID) AS TOTAL from dept_sal

  DEPT_ID 	ENAME 		SAL 		TOTAL
1 1000 	A 		3500 		10500
2 1000 	B 		3500 		10500
3 1000 	C 		1500 		10500
4 1000 	D 		2000 		10500
5 2000 	E 		2500 		18500
6 2000 	F 		2000 		18500
7 2000 	G 		3500 		18500

 

 4.无partition by无order by:  所有数据相加.

SQL>>select DEPT_ID,ENAME,SAL,sum(SAL) over() AS TOTAL from  dept_sal

    DEPT_ID ENAME SAL TOTAL
1 1000 A 3500 18500
2 1000 B 3500 18500
3 1000 C 1500 18500
4 1000 D 2000 18500
5 2000 E 2500 18500
6 2000 F 2000 18500
7 2000 G 3500 18500



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值