在每行添加一个总和,用于添加上一行的总和

时间:2014-12-04 21:40:45

标签: oracle oracle11g

我需要在每一行上得到一笔总和,它还会增加上一行的总数

这是示例数据

    Fax         Counts
    2063504752  1
    2080906666  1
    7180930966  2
    7182160901  1
    7182232046  1
    7182234134  1
    7182234166  0
    7182248132  2
    7182390090  1
    7182395285  0
    7185462234  0
    7185465013  1
    7185465281  1
    7185466029  0



here's the desired output

Fax         Counts  Totals
2063504752  1   1
2080906666  1   2
7180930966  2   4
7182160901  1   5
7182232046  1   6
7182234134  1   7
7182234166  0   7
7182248132  2   9
7182390090  1   10
7182395285  0   10
7185462234  0   10
7185465013  1   11
7185465281  1   12
7185466029  0   12

所以我想把第一行记录在Totals列(1)

转到第二行,将该行(1)中的计数添加到上一行(1)中的总计,将结果记录为总计(2)

转到第三行。将该行(2)中的计数添加到上一行(2)的总计中,将结果记录为总计(4)

转到第四行。将该行(1)中的计数添加到前一行(4)的总计中,将结果记录为总计(5)

等等

我知道LAG函数会读取前一行的值,但我不能编码前两行,它看起来像一个循环引用。

这是我得到的。它只是对最后两行进行求和,我无法添加以前值的总和

WITH T AS
       (SELECT 2063504752 fax
           ,1 counts
          FROM DUAL
        UNION ALL
        SELECT 2080906666
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7180930966
           ,2
          FROM DUAL
        UNION ALL
        SELECT 7182160901
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7182232046
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7182234134
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7182234166
           ,0
          FROM DUAL
        UNION ALL
        SELECT 7182248132
           ,2
          FROM DUAL
        UNION ALL
        SELECT 7182390090
           ,2
          FROM DUAL
        UNION ALL
        SELECT 7182395285
           ,0
          FROM DUAL
        UNION ALL
        SELECT 7185462234
           ,0
          FROM DUAL
        UNION ALL
        SELECT 7185465013
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7185465281
           ,1
          FROM DUAL
        UNION ALL
        SELECT 7185466029
           ,0
          FROM DUAL)
SELECT fax
      ,counts
      ,counts + LAG(counts, 1) OVER (ORDER BY fax) Counts1
  FROM T

1 个答案:

答案 0 :(得分:1)

使用分析函数:

select OtherID, Counts, sum(Counts) over(order by OtherID) Totals
from your_table;

sum(Counts) over(order by OtherID)告诉Oracle将总和应用于“开始”(根据ORDER BY)直到当前行的所有行。

分析函数类似于聚合函数,但会为每一行生成结果。此外,您可以告诉Oracle必须使用哪些行(窗口)来计算每行的结果。