一、oracle
需要使用SUM() OVER()
select empno,deptno,sal,sum(sal) over(partition by deptno) sumvalue
from emp order by deptno,empno;
结果为:
7782 10 1200 7500
7839 10 5000 7500
7934 10 1300 7500
7369 20 1100 11175
7566 20 2975 11175
7788 20 3000 11175
7876 20 1100 11175
7902 20 3000 11175
7499 30 1600 9400
7521 30 1250 9400
7654 30 1250 9400
7698 30 2850 9400
7844 30 1500 9400
7900 30 950 9400
从结果来看,数据是按deptno进行了求和,当然这样的数据也可以通过子查询group by来实现,但是最后一列数据并没为没有对倒数第二列进行累计求和
select empno,deptno,sal,sum(sal) over(partition by deptno order by empno) sumvalue
from emp order by deptno,empno;
结果为:
7782 10 1200 1200
7839 10 5000 6200
7934 10 1300 7500
7369 20 1100 1100
7566 20 2975 4075
7788 20 3000 7075
7876 20 1100 8175
7902 20 3000 11175
7499 30 1600 1600
7521 30 1250 2850
7654 30 1250 4100
7698 30 2850 6950
7844 30 1500 8450
7900 30 950 9400
这样的结果就是按照deptno进行分组累计求和了
二、sql server
select empno,deptno,sal,sum(sal) over(partition by deptno) sumValue
from emp order by deptno,empno;
这个方式与oracle的结果是一样的,这里不在展示
select empno,deptno,sal,sum(sal) over(partition by deptno order by empno) sumValue
from emp order by deptno,empno;
这样加上了order by在sql server里面就报错了,很纠结,累计求和就只能通过子查询来实现了
select empno,deptno,sal,
(select SUM(SAL) FROM emp innerEmp WHERE innerEmp.deptno=emp.deptno AND innerEmp.empno<=emp.empno) sumValue
from emp
order by emp.deptno,emp.empno;
结果为:
7782 10 2450.00 2450.00
7839 10 5000.00 7450.00
7934 10 1300.00 8750.00
7369 20 800.00 800.00
7566 20 2975.00 3775.00
7788 20 3000.00 6775.00
7876 20 1100.00 7875.00
7902 20 3000.00 10875.00
7499 30 1600.00 1600.00
7521 30 1250.00 2850.00
7654 30 1250.00 4100.00
7698 30 2850.00 6950.00
7844 30 1500.00 8450.00
7900 30 950.00 9400.00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
也许还有更好的方法,欢迎大家提出宝贵意见