一、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
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
也许还有更好的方法,欢迎大家提出宝贵意见