我有一个带有表'事务'的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是否更好?或者这是不可能做到的?
答案 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;
一些注意事项:
窗口函数SUM() OVER (PARTITION BY ... ORDER BY ... RANGE)
具有魔力。在这种情况下,我们不分区(重新开始计算)数据集,所以我们可以跳过它。我们在窗口中包含ORDER BY
以确保我们按正确的顺序对值进行求和,但我们也正常表示整个值集的ORDER BY
。你可以通过谷歌RANGE
条款,但你可以看到它是相当简单的语言。
顺便说一句,使用CHAR
作为交易标志很尴尬。我建议将其存储为有符号整数1
和-1
,这样您就可以将金额乘以交易标志列。