oracle sum()over函数的使用

oracle sum()over函数的使用
 
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。 
 
over函数的参数:over(partition by columnname1 order by columnname2) 
含义,按columname1指定的字段进行分组排序,或者说按字段columnname1的值进行分组排序。 
例如:employees表中,有两个部门的记录:department_id =10和20 
 
select department_id,rank() over(partition by department_id order by salary) from employees   www.2cto.com  
 
就是指在部门10中进行薪水的排名,在部门20中进行薪水排名。 
 
如果是partition by org_id,则是在整个公司内进行排名。 
------------------------------- 
sum(...) over ... 的使用 
 
根据over(...)条件的不同 
 
使用 sum(sal) over (order by ename)... 查询员工的薪水“连续”求和; 
 
注意over (order by ename)如果没有order by 子句,求和就不是“连续”的, 
把所有的值加到一起作为一个值。体会一下不同之处: 
 
SQL> select deptno,ename,sal, 
2 sum(sal) over (order by ename) 连续求和, 
3 sum(sal) over () 总和, -- 此处sum(sal) over () 等同于sum(sal) 
4 100*round(sal/sum(sal) over (),4) "份额(%)" 
5 from emp 
6 /   www.2cto.com  
 
    DEPTNO ENAME             SAL   连续求和       总和    份额(%) 
---------- ---------- ---------- ---------- ---------- ---------- 
        20 ADAMS            1100       1100      29025       3.79 
        30 ALLEN            1600       2700      29025       5.51 
        30 BLAKE            2850       5550      29025       9.82 
        10 CLARK            2450       8000      29025       8.44 
        20 FORD             3000      11000      29025      10.34 
        30 JAMES             950      11950      29025       3.27 
        20 JONES            2975      14925      29025      10.25 
        10 KING             5000      19925      29025      17.23 
        30 MARTIN           1250      21175      29025       4.31 
        10 MILLER           1300      22475      29025       4.48 
        20 SCOTT            3000      25475      29025      10.34 
        20 SMITH             800      26275      29025       2.76 
        30 TURNER           1500      27775      29025       5.17 
        30 WARD             1250      29025      29025       4.31 
 
使用子分区查出各部门薪水连续的总和。注意按部门分区。注意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)。 
 
SQL> select deptno,ename,sal, 
2 sum(sal) over (partition by deptno order by ename) 部门连续求和,--各部门的薪水"连续"求和   www.2cto.com  
3 sum(sal) over (partition by deptno) 部门总和, -- 部门统计的总和,同一部门总和不变 
4 100*round(sal/sum(sal) over (partition by deptno),4) "部门份额(%)", 
5 sum(sal) over (order by deptno,ename) 连续求和, --所有部门的薪水"连续"求和 
6 sum(sal) over () 总和, -- 此处sum(sal) over () 等同于sum(sal),所有员工的薪水总和 
7 100*round(sal/sum(sal) over (),4) "总份额(%)" 
8 from emp 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值