>问题
查看 Oracle Base 中的 SUM 分析函数并运行 SQL 并期望 SUM 一次添加一行工资。
SELECT
deptno,
ename,
sal,
SUM(sal)
OVER (
PARTITION BY deptno
ORDER BY sal
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
AS RUNNING_TOTAL_IN_DEPT
FROM
emp
ORDER BY deptno, sal
;
但是,对于具有相同工资值的行,将添加具有相同工资值的行的小计。
DEPTNO ENAME SAL RUNNING_TOTAL_IN_DEPT
20 SMITH 800 800
20 ADAMS 1100 1900
20 JONES 2975 4875
20 SCOTT 3000 10875 <--- Why not 7875? How to make this to 7875?
20 FORD 3000 10875
30 JAMES 950 950
30 MARTIN 1250 3450 <--- Why not 2200?
30 WARD 1250 3450
30 TURNER 1500 4950
30 ALLEN 1600 6550
问题
请解释这种行为以及如何一次将总和相加,即使有多行具有相同的工资值。
您使用的是RANGE BETWEEN
而不是ROWS BETWEEN
。RANGE BETWEEN
将具有相同键值的所有行视为相同行,因此它们都获得"完整"值。
Oracle 文档在解释这一点方面做得不好。 这是一篇提供一些背景的博客文章。
你想要ROWS BETWEEN
而不是RANGE BETWEEN
:
SELECT deptno, ename, sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY sal
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RUNNING_TOTAL_IN_DEPT
FROM emp
ORDER BY deptno, sal;