zoukankan      html  css  js  c++  java
  • 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

    11000 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

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Oracle函数如何把符串装换为小写的格式
    Oralce中的synonym同义词
    JS中getYear()的兼容问题
    How to do SSH Tunneling (Port Forwarding)
    所谓深度链接(Deep linking)
    upload size of asp.net
    发一个自动刷网站PV流量的小工具
    解决Visual Studio 2008 下,打开.dbml(LINQ) 文件时,提示"The operation could not be completed." 的问题。
    在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录
    使用SQL语句获取Sql Server数据库的版本
  • 原文地址:https://www.cnblogs.com/likeju/p/4978080.html
Copyright © 2011-2022 走看看