Oracle PL/SQL Tutorial/Analytical Functions/UNBOUNDED

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

Displaying a Running Total Using SUM as an Analytical Function

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>


Unbounded Following

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>