数据库累计值查询

一、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


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

也许还有更好的方法,欢迎大家提出宝贵意见

 

你可能感兴趣的:(oracle,sql,数据库,server)