Oracle PL/SQL Tutorial/Analytical Functions/UNBOUNDED

Материал из SQL эксперт
Перейти к: навигация, поиск

Displaying a Running Total Using SUM as an Analytical Function

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table myTable(

 2    id           NUMBER(2),
 3    value        NUMBER(6,2)
 4  )
 5  /

Table created. SQL> SQL> -- prepare data SQL> insert into myTable(ID, value)values (1,9); 1 row created. SQL> insert into myTable(ID, value)values (2,2.11); 1 row created. SQL> insert into myTable(ID, value)values (3,3.44); 1 row created. SQL> insert into myTable(ID, value)values (4,-4.21); 1 row created. SQL> insert into myTable(ID, value)values (5,10); 1 row created. SQL> insert into myTable(ID, value)values (6,3); 1 row created. SQL> insert into myTable(ID, value)values (7,-5.88); 1 row created. SQL> insert into myTable(ID, value)values (8,123.45); 1 row created. SQL> insert into myTable(ID, value)values (9,98.23); 1 row created. SQL> insert into myTable(ID, value)values (10,938.23); 1 row created. SQL> insert into myTable(ID, value)values (11,984.23); 1 row created. SQL> insert into myTable(ID, value)values (12,198.23); 1 row created. SQL> insert into myTable(ID, value)values (13,928.87); 1 row created. SQL> insert into myTable(ID, value)values (14,25.37); 1 row created. SQL> insert into myTable(ID, value)values (15,918.3); 1 row created. SQL> insert into myTable(ID, value)values (16,9.23); 1 row created. SQL> insert into myTable(ID, value)values (17,8.23); 1 row created. SQL> SQL> select * from myTable

 2  /
       ID      VALUE

----------
        1          9
        2       2.11
        3       3.44
        4      -4.21
        5         10
        6          3
        7      -5.88
        8     123.45
        9      98.23
       10     938.23
       11     984.23
       12     198.23
       13     928.87
       14      25.37
       15      918.3
       16       9.23
       17       8.23

17 rows selected. SQL> SQL> SQL> COLUMN "Running total" FORMAT 99,999.99 SQL> SELECT id "ID", value,

 2    SUM(value) OVER(ORDER BY id
 3      ROWS BETWEEN UNBOUNDED PRECEDING
 4      AND CURRENT ROW) "Running total"
 5  FROM myTable
 6  ORDER BY id;
       ID      VALUE Running total

---------- -------------
        1          9          9.00
        2       2.11         11.11
        3       3.44         14.55
        4      -4.21         10.34
        5         10         20.34
        6          3         23.34
        7      -5.88         17.46
        8     123.45        140.91
        9      98.23        239.14
       10     938.23      1,177.37
       11     984.23      2,161.60
       ID      VALUE Running total

---------- -------------
       12     198.23      2,359.83
       13     928.87      3,288.70
       14      25.37      3,314.07
       15      918.3      4,232.37
       16       9.23      4,241.60
       17       8.23      4,249.83

17 rows selected. SQL> SQL> SQL> SQL> -- clean the table SQL> drop table myTable

 2  /

Table dropped. SQL> SQL> SQL></source>


Unbounded Following

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table myTable(

 2    id           NUMBER(2),
 3    value        NUMBER(6,2)
 4  )
 5  /

Table created. SQL> SQL> -- prepare data SQL> insert into myTable(ID, value)values (1,9); 1 row created. SQL> insert into myTable(ID, value)values (2,2.11); 1 row created. SQL> insert into myTable(ID, value)values (3,3.44); 1 row created. SQL> insert into myTable(ID, value)values (4,-4.21); 1 row created. SQL> insert into myTable(ID, value)values (5,10); 1 row created. SQL> insert into myTable(ID, value)values (6,3); 1 row created. SQL> insert into myTable(ID, value)values (7,-5.88); 1 row created. SQL> insert into myTable(ID, value)values (8,123.45); 1 row created. SQL> insert into myTable(ID, value)values (9,98.23); 1 row created. SQL> insert into myTable(ID, value)values (10,938.23); 1 row created. SQL> insert into myTable(ID, value)values (11,984.23); 1 row created. SQL> insert into myTable(ID, value)values (12,198.23); 1 row created. SQL> insert into myTable(ID, value)values (13,928.87); 1 row created. SQL> insert into myTable(ID, value)values (14,25.37); 1 row created. SQL> insert into myTable(ID, value)values (15,918.3); 1 row created. SQL> insert into myTable(ID, value)values (16,9.23); 1 row created. SQL> insert into myTable(ID, value)values (17,8.23); 1 row created. SQL> SQL> select * from myTable

 2  /
       ID      VALUE

----------
        1          9
        2       2.11
        3       3.44
        4      -4.21
        5         10
        6          3
        7      -5.88
        8     123.45
        9      98.23
       10     938.23
       11     984.23
       ID      VALUE

----------
       12     198.23
       13     928.87
       14      25.37
       15      918.3
       16       9.23
       17       8.23

17 rows selected. SQL> SQL> SQL> SELECT id "ID", value,

 2    SUM(value) OVER(ORDER BY id
 3      ROWS BETWEEN CURRENT ROW
 4      AND UNBOUNDED FOLLOWING) "Running total"
 5  FROM myTable
 6  ORDER BY id;
       ID      VALUE Running total

---------- -------------
        1          9      4,249.83
        2       2.11      4,240.83
        3       3.44      4,238.72
        4      -4.21      4,235.28
        5         10      4,239.49
        6          3      4,229.49
        7      -5.88      4,226.49
        8     123.45      4,232.37
        9      98.23      4,108.92
       10     938.23      4,010.69
       11     984.23      3,072.46
       ID      VALUE Running total

---------- -------------
       12     198.23      2,088.23
       13     928.87      1,890.00
       14      25.37        961.13
       15      918.3        935.76
       16       9.23         17.46
       17       8.23          8.23

17 rows selected. SQL> SQL> SQL> SQL> -- clean the table SQL> drop table myTable

 2  /

Table dropped. SQL> SQL></source>