oracle中如何求和

how to do cumulative sums in oracle

我是 SQL 的新手,我想做一份报告,显示每个班次的每日票数以及迄今为止的总数。

这是我的查询,它显示下面的前 5 列:

    SELECT 
    TO_CHAR(DTTM,'YYYY-MM-DD') as "DATE"
    ,COUNT(CASE WHEN TO_CHAR(DTTM, 'HH24:MI') BETWEEN '14:00' AND '22:00' THEN TKTNUM ELSE NULL END) AS "DAYS"
    ,COUNT(CASE WHEN TO_CHAR(DTTM, 'HH24:MI') BETWEEN '06:00' AND '14:00' THEN TKTNUM ELSE NULL END) AS "MIDS"
    ,COUNT(CASE WHEN TO_CHAR(DTTM, 'HH24:MI') NOT BETWEEN '06:00' AND '22:00' THEN TKTNUM ELSE NULL END) AS "SWINGS"
    ,COUNT(TKTNUM) AS "TOTAL"
    FROM TKTHISTORY
    GROUP BY TO_CHAR(DTTM,'YYYY-MM-DD')
    ORDER BY TO_CHAR(DTTM,'YYYY-MM-DD')

DATE        DAYS    MIDS    SWINGS  TOTAL   
2019-08-01  8       13      1       22      22
2019-08-02  19      5       3       27      49
2019-08-03  23      6       6       35      84
2019-08-04  7       9       13      29      113
2019-08-05  4       17      2       23      136
2019-08-06  10      5       16      31      167
2019-08-07  3       12      11      26      193

第 6 列应该是日期的累计总和。我尝试浏览互联网并阅读了有关 "over" 和 "partition by" 的内容,但我仍然不知道如何使用它:(

这是一个基于 Scott 的 EMP table 的示例,它计算每个部门的职位。最后一列是 "running total" 值。

示例数据显示,DEPTNO = 10 中有 3 名员工,其中 5 名在部门。 20 和 6 在部门。 30:

SQL> select deptno, empno, ename from emp order by deptno;

    DEPTNO      EMPNO ENAME
---------- ---------- ----------
        10       7782 CLARK
        10       7839 KING
        10       7934 MILLER
        20       7566 JONES
        20       7902 FORD
        20       7876 ADAMS
        20       7369 SMITH
        20       7788 SCOTT
        30       7521 WARD
        30       7844 TURNER
        30       7499 ALLEN
        30       7900 JAMES
        30       7698 BLAKE
        30       7654 MARTIN

14 rows selected.

查询如下所示:

SQL> select
  2    deptno,
  3    count(empno) emps_per_dept,
  4    sum(count(*)) over (order by deptno) total
  5  from emp
  6  group by deptno;

    DEPTNO EMPS_PER_DEPT      TOTAL
---------- ------------- ----------
        10             3          3
        20             5          8
        30             6         14

SQL>

在你的情况下,可能是这样的:

SELECT 
   ...
  ,sum(COUNT(TKTNUM)) over (order by TO_CHAR(DTTM,'YYYY-MM-DD')) AS "TOTAL"
FROM TKTHISTORY
...