通过价格+余额从上一行汇总余额

时间:2015-08-30 22:23:44

标签: database oracle

我有一个带有表'事务'的Oracle数据库11g。 我希望得到平衡。

我现在有:

|   Date   |   Description    | min_plus | amount | balance |
| 4-7-2015 | Gift from Dad    | +        | 45,00  |       0 |
| 5-7-2015 | Gift to Sister   | -        | 3,00   |       0 |
| 6-7-2015 | Gift from Aunt   | +        | 2,50   |       0 |

我正在寻找:

|   Date   |   Description    | min_plus | amount | balance |
| 4-7-2015 | Gift from Dad    | +        | 45,00  |  45,00  |
| 5-7-2015 | Gift to Sister   | -        | 3,00   |  42,00  |
| 6-7-2015 | Gift from Aunt   | +        | 2,50   |  44,50  |

这是否可以使用虚拟colmn,使用PL / SQL是否更好?或者这是不可能做到的?

1 个答案:

答案 0 :(得分:2)

当您选择要显示的数据时,您可以在纯SQL中获得运行总计。无需创建平衡列或某些PL / SQL技巧。 Oracle窗口函数使用起来很棒!在这种情况下,我们希望SUM()从事务日期顺序的第一行到当前行的amount列。你可以用令人惊讶的简单语言表达这一点:

with sample_data as (
    select to_date('04-07-2015', 'MM-DD-YYYY') datecol, 'Gift from Dad' description, '+' min_plus, 45 amount from dual union all
    select to_date('05-07-2015', 'MM-DD-YYYY'), 'Gift to Sister', '-', 3 from dual union all
    select to_date('06-07-2015', 'MM-DD-YYYY'), 'Gift from Aunt', '+', 2 from dual)

select datecol, description, min_plus, amount,
sum(case when min_plus = '-' then -1 * amount else amount end) 
  over (order by datecol rows between unbounded preceding and current row) balance
from sample_data
order by datecol;

SQL Fiddle Example

一些注意事项: 窗口函数SUM() OVER (PARTITION BY ... ORDER BY ... RANGE)具有魔力。在这种情况下,我们不分区(重新开始计算)数据集,所以我们可以跳过它。我们在窗口中包含ORDER BY以确保我们按正确的顺序对值进行求和,但我们也正常表示整个值集的ORDER BY。你可以通过谷歌RANGE条款,但你可以看到它是相当简单的语言。

顺便说一句,使用CHAR作为交易标志很尴尬。我建议将其存储为有符号整数1-1,这样您就可以将金额乘以交易标志列。