SQL 修改累计值,你想依据另一列的值来修改累计值。试想这样的场景:你希望显示一个信用卡账户的交易历史,并显示每一笔交易完成后的余额。本实例将会用到如下所示的视图 V
。
SQL 修改累计值 问题描述
你想依据另一列的值来修改累计值。试想这样的场景:你希望显示一个信用卡账户的交易历史,并显示每一笔交易完成后的余额。本实例将会用到如下所示的视图 V
。
ID
列能唯一地标示每一笔交易。AMT
列代表每一笔交易涉及的金额(要么是还款,要么是购物)。TRX
列定义交易的类型:还款是 PY
,购物是 PR
。如果 TRX
的值是 PY
,你希望能从累计值里减去当前的 AMT
值。如果 TRX
的值是 PR
,你希望累计值加上当前的 AMT
值。最终,你想得到如下所示的结果集。
SQL 修改累计值 解决方案
DB2 和Oracle
使用窗口函数 SUM OVER
进行累计求和,并使用 CASE
表达式来决定交易的类型。
MySQL、PostgreSQL 和 SQL Server
使用标量子查询进行累计求和,并使用 CASE
表达式来决定交易的类型。
SQL 修改累计值 扩展知识
CASE
表达式用于决定是把当前的 AMT
值加到累计值中,还是从累计值中减去当前的 AMT
值。如果交易类型是还款,AMT
值会被变为负数,因而相应的累计值会减少。CASE
表达式的结果如下所示。
依据交易类型的评估结果,AMT
值会被加入累计值,或者从累计值中减去。关于如何使用窗口函数 SUM OVER
或者标量子查询进行累计求和,请参考 7.6 节。