查询以汇总先前的值

时间:2015-05-26 05:08:08

标签: sql oracle sum running-total

我有图像actual data and the result expected中的表格结构。

我需要将值添加到先前值的总和中(显示在必需结果中) 我尝试了以下查询

SELECT empid,
sum(tot_hours) OVER (PARTITION BY empid ORDER BY empid ) AS tot_hours
        FROM empDet
       ORDER BY empid

但我得到以下结果集

the result for the given query

但我需要第一张照片中的结果。

任何人都可以帮我这样做吗?

1 个答案:

答案 0 :(得分:4)

  

sum(tot_hours)OVER(由empid ORDER BY empid分配)AS tot_hours

您的 ORDER BY 不正确。如果您希望TOT_HOURS上的运行SUM ,则应按tot_hours排序。

例如,以下查询将计算每个部门员工薪水的运行总和:

SQL> SELECT deptno,
  2    sal,
  3    SUM(sal) OVER (PARTITION BY deptno ORDER BY sal ) AS tot_sal
  4  FROM emp
  5  ORDER BY deptno;

    DEPTNO        SAL    TOT_SAL
---------- ---------- ----------
        10       1300       1300
        10       2450       3750
        10       5000       8750
        20        800        800
        20       1100       1900
        20       2975       4875
        20       3000      10875
        20       3000      10875
        30        950        950
        30       1250       3450
        30       1250       3450
        30       1500       4950
        30       1600       6550
        30       2850       9400

14 rows selected.

SQL>

更新对于重复值,运行总计将重复。要使其唯一,请使用 UNBOUNDED PRECEDING 子句。例如,

SQL> SELECT empno, deptno,
  2    sal,
  3    SUM(sal) OVER (PARTITION BY deptno ORDER BY sal ROWS UNBOUNDED PRECEDING) AS tot_sal
  4  FROM emp
  5  ORDER BY deptno;

     EMPNO     DEPTNO        SAL    TOT_SAL
---------- ---------- ---------- ----------
      7934         10       1300       1300
                   10       1300       2600
      7782         10       2450       5050
      7839         10       5000      10050
      7369         20        800        800
      7876         20       1100       1900
      7566         20       2975       4875
      7788         20       3000       7875
      7902         20       3000      10875
      7900         30        950        950
      7521         30       1250       2200
      7654         30       1250       3450
      7844         30       1500       4950
      7499         30       1600       6550
      7698         30       2850       9400

15 rows selected.

SQL>