首先创建一个示例的视图:
SQL> create or replace view test_sum(id ,amt,trx)
2 as
3 select 1,100,'PR' from dual union all
4 select 2,100,'PR' from dual union all
5 select 3,50,'PY' from dual union all
6 select 4,100,'PR' from dual union all
7 select 5,200,'PY' from dual union all
8 select 6,100,'PY' from dual;
View created.
SQL> select * from test_sum;
ID AMT TR
---------- ---------- --
1 100 PR
2 100 PR
3 50 PY
4 100 PR
5 200 PY
6 100 PY
6 rows selected.
SQL>
此视图模拟存取款视图
id 是唯一列
amt 表示每次事务处理(取款/存款)涉及的类型
trx 定义事务处理的类型,取款是PY,存款是PR
需求:计算每次存、取款后的金额,如果TRX是PR,则加上AMT所代表的金额,否则减去。
第一步:首先把取款的值变为负数
SQL> select id,
2 case when trx = 'PR' then '存款' else '取款' end 存取类型,
3 amt 金额,
4 case when trx = 'PR' then amt else -amt end 变更后的值
5 from test_sum
6 order by id;
ID 存取类型 金额 变更后的值
---------- -------- ---------- ----------
1 存款 100 100
2 存款 100 100
3 取款 50 -50
4 存款 100 100
5 取款 200 -200
6 取款 100 -100
6 rows selected
SQL>
第二步,使用sum分析函数
SQL> select id,
2 case when trx = 'PR' then '存款' else '取款' end 存取类型,
3 amt 金额,
4 sum(case when trx = 'PR' then amt else -amt end) over(order by id) as 余额
5 from test_sum
6 order by id;
ID 存取类型 金额 余额
---------- -------- ---------- ----------
1 存款 100 100
2 存款 100 200
3 取款 50 150
4 存款 100 250
5 取款 200 50
6 取款 100 -50
6 rows selected
SQL>
到此,更改累计和的值的步骤就已经做完了。