【问题标题】:Oracle analytics SUM SQL does not sum one at a time in windowOracle 分析 SUM SQL 不会在窗口中一次求和一个
【发布时间】:2018-05-11 19:31:52
【问题描述】:

问题

查看Oracle Base 中的SUM Analytic Function 并运行期望SUM 的SQL 将一次添加一行工资。

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

问题

请解释这种行为以及如何一次将总和相加,即使有多行具有相同的薪水值。

【问题讨论】:

  • 改用rows

标签: sql oracle analytics


【解决方案1】:

您使用的是RANGE BETWEEN 而不是ROWS BETWEENRANGE BETWEEN 将具有相同键值的所有行视为相同,因此它们都获得“完整”值。

Oracle 文档没有很好地解释这一点。 Here 是一篇博文,提供了一些背景知识。

【讨论】:

    【解决方案2】:

    你想要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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多