Oracle PL/SQL Tutorial/Analytical Functions/UNBOUNDED
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>