您的位置:首页 > 数据库 > Oracle

ORACLE的 SUM()OVER()函数的使用1

2013-07-21 21:40 519 查看
 

over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。 
 
over函数的参数:over(partition by columnname1 order by columnname2) 
含义,按columname1指定的字段进行分组排序,或者说按字段columnname1的值进行分组排序。 
例如:employees表中,有两个部门的记录:depart_id =10和20 
 
select depart_id,name , rank() over(partition by depart_id order by salary) from employees    
 
就是指在部门10中进行薪水的排名,在部门20中进行薪水排名。 
 
如果是partition by org_id,则是在整个公司内进行排名。 
------------------------------- 
sum(...) over ... 的使用 
 
根据over(...)条件的不同 
 
使用 sum(salary) over (order by name)... 查询员工的薪水“连续”求和; 
 
注意over (order by name)如果没有order by 子句,求和就不是“连续”的, 
把所有的值加到一起作为一个值。体会一下不同之处: 
 
SQL> select dept_id,name,salary, 
2 sum(salary) over (order by name) 连续求和, 
3 sum(salary) over () 总和, -- 此处sum(salary) over () 等同于sum(salary) 
4 100*round(salary/sum(salary) over (),4) "份额(%)" 
5 from employees
6 /   
    DEPT_ID NAME             SALARY   连续求和       总和    份额(%) 
---------- ---------- ---------- ---------- ---------- ---------- 
        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(salary) over (partition by dept_id order by name) 按部门“连续”求总和 
sum(salary) over (partition by dept_id) 按部门求总和 
 
sum(salary) over (order by dept_id,name) 不按部门“连续”求总和 
sum(salary) over () 不按部门,求所有员工总和,效果等同于sum(salary)。 
 
SQL> select dept_id,name,salary, 
2 sum(salary) over (partition by dept_id order by name) 部门连续求和,--各部门的薪水"连续"求和  
3 sum(salary) over (partition by dept_id) 部门总和, -- 部门统计的总和,同一部门总和不变 
4 100*round(salary/sum(salary) over (partition by dept_id),4) "部门份额(%)", 
5 sum(salary) over (order by dept_id,name) 连续求和, --所有部门的薪水"连续"求和 
6 sum(salary) over () 总和, -- 此处sum(salary) over () 等同于sum(salary),所有员工的薪水总和 
7 100*round(salary/sum(salary) over (),4) "总份额(%)" 
8 from employees 
9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle over sum