Oracle 分析 SUM SQL 不会在窗口中一次求和一个



>问题

查看 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 BETWEENRANGE 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;

最新更新