计算Oracle中的运行总计

时间:2015-09-29 11:43:19

标签: sql oracle group-by

我想提出一个查询,它会按周显示我网页上的用户数量。

我使用以下查询来运行用户数据库并获取按周分组的数字:

SELECT TRUNC(FAB.LICENSE_DATE, 'IW'),
       COUNT(DISTINCT FAB.STATEMENT_NUMBER) AS "Number of account statements"
  FROM USERS FAB
 GROUP BY TRUNC(FAB.LAST_UPDATED_TIME, 'IW');

这给出了以下输出:

 Date        |  Users
----------------------
 2015/09/07  |  5
 2015/09/14  |  4
 2015/09/21  |  6

但这实际上不是我想要实现的目标。我希望得到以下输出:

 Date        | Users
----------------------
 2015/09/07  | 5
 2015/09/14  | 9 (5 + 4)
 2015/09/21  | 15 (5 + 4 + 6)

如何修改查询以便获得所有结果?

4 个答案:

答案 0 :(得分:1)

SELECT TRUNC(FAB.LICENSE_DATE, 'IW'), 
SUM(COUNT(DISTINCT FAB.STATEMENT_NUMBER)) OVER (ORDER BY  TRUNC(FAB.LAST_UPDATED_TIME, 'IW')) as "Number of account statements"
FROM USERS FAB
GROUP BY TRUNC(FAB.LAST_UPDATED_TIME, 'IW');

答案 1 :(得分:1)

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE USERS (
  LICENSE_DATE,
  LAST_UPDATED_TIME,
  STATEMENT_NUMBER
) AS
          SELECT DATE '2015-09-07', DATE '2015-09-07', 1 FROM DUAL
UNION ALL SELECT DATE '2015-09-08', DATE '2015-09-08', 2 FROM DUAL
UNION ALL SELECT DATE '2015-09-08', DATE '2015-09-08', 3 FROM DUAL
UNION ALL SELECT DATE '2015-09-09', DATE '2015-09-09', 4 FROM DUAL
UNION ALL SELECT DATE '2015-09-12', DATE '2015-09-12', 5 FROM DUAL
UNION ALL SELECT DATE '2015-09-14', DATE '2015-09-15', 6 FROM DUAL
UNION ALL SELECT DATE '2015-09-15', DATE '2015-09-16', 7 FROM DUAL
UNION ALL SELECT DATE '2015-09-16', DATE '2015-09-16', 8 FROM DUAL
UNION ALL SELECT DATE '2015-09-17', DATE '2015-09-18', 9 FROM DUAL
UNION ALL SELECT DATE '2015-09-21', DATE '2015-09-21', 10 FROM DUAL
UNION ALL SELECT DATE '2015-09-21', DATE '2015-09-26', 11 FROM DUAL
UNION ALL SELECT DATE '2015-09-22', DATE '2015-09-22', 12 FROM DUAL
UNION ALL SELECT DATE '2015-09-23', DATE '2015-09-25', 13 FROM DUAL
UNION ALL SELECT DATE '2015-09-24', DATE '2015-09-24', 14 FROM DUAL
UNION ALL SELECT DATE '2015-09-27', DATE '2015-09-27', 15 FROM DUAL;

查询1

SELECT LAST_UPDATED_WEEK,
       SUM( NUM_STATEMENTS ) OVER ( ORDER BY LAST_UPDATED_WEEK ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS "Number of account statements"
FROM (
  SELECT TRUNC(LAST_UPDATED_TIME, 'IW') AS LAST_UPDATED_WEEK,
         COUNT(DISTINCT STATEMENT_NUMBER) AS NUM_STATEMENTS
  FROM   USERS
  GROUP BY
         TRUNC( LAST_UPDATED_TIME, 'IW')
)

<强> Results

|           LAST_UPDATED_WEEK | Number of account statements |
|-----------------------------|------------------------------|
| September, 07 2015 00:00:00 |                            5 |
| September, 14 2015 00:00:00 |                            9 |
| September, 21 2015 00:00:00 |                           15 |

答案 2 :(得分:0)

您可以使用此代码块解决您的问题:

select u.date ,(select sum(u1.users) from users u1 where u1.ddate <= u.date) as users from users u;

它给出了这个输出:

07.09.2015 5 14.09.2015 9 21.09.2015 15

祝你好运

答案 3 :(得分:0)

Hello you can try this code too.

WITH t1 AS
  ( SELECT to_date('01/01/2015','mm/dd/yyyy') rn, 5 usrs FROM dual
  UNION ALL
  SELECT to_date('02/01/2015','mm/dd/yyyy') rn, 4 usrs FROM dual
  UNION ALL
  SELECT to_date('03/01/2015','mm/dd/yyyy') rn, 8 usrs FROM dual
  UNION ALL
  SELECT to_date('04/01/2015','mm/dd/yyyy') rn, 2 usrs FROM dual
  )
SELECT rn,
  usrs,
  sum(usrs) over (order by rn ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) cumm_usrs
FROM t1
GROUP BY rn,
  usrs;