先来看一下表中的原始数据
SQL> select ename,sal from emp;
ENAME SAL
---------- ----------
SMITH 800
ALLEN 1600
WARD 1250
JONES 2975
MARTIN 1250
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100
ENAME SAL
---------- ----------
JAMES 950
FORD 3000
MILLER 1300
14 rows selected.
OK,现在我们通过SUM()OVER()来实现累计的功能
SQL> select ename,sal,
2 sum(sal) over(order by sal) as total
3 from emp;
ENAME SAL TOTAL
---------- ---------- ----------
SMITH 800 800
JAMES 950 1750
ADAMS 1100 2850
WARD 1250 5350
MARTIN 1250 5350
MILLER 1300 6650
TURNER 1500 8150
ALLEN 1600 9750
CLARK 2450 12200
BLAKE 2850 15050
JONES 2975 18025
ENAME SAL TOTAL
---------- ---------- ----------
SCOTT 3000 24025
FORD 3000 24025
KING 5000 29025
仔细看一下红色标注出来的部分,好像有问题哦,因为两者的sal是一样的。下面我们在over()中加一个字段再看看结果。
SQL> select ename,sal,
2 sum(sal) over(order by sal,empno) as total
3 from emp;
ENAME SAL TOTAL
---------- ---------- ----------
SMITH 800 800
JAMES 950 1750
ADAMS 1100 2850
WARD 1250 4100
MARTIN 1250 5350
MILLER 1300 6650
TURNER 1500 8150
ALLEN 1600 9750
CLARK 2450 12200
BLAKE 2850 15050
JONES 2975 18025
ENAME SAL TOTAL
---------- ---------- ----------
SCOTT 3000 21025
FORD 3000 24025
KING 5000 29025
14 rows selected.
这下就好了,得到我们想要的正确结果了。因为光凭sal一个字段是无法唯一的标识一条记录的,加上empno字段就可以了。