Database 通过价格计算的总余额+上一行的余额

Database 通过价格计算的总余额+上一行的余额,database,oracle,Database,Oracle,我有一个带有表“Transaction”的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

我有一个带有表“Transaction”的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  |

对于虚拟列,这可能吗?使用PL/SQL更好还是不可能?当您选择要显示的数据时,您可以使用普通SQL获得运行总数。不需要创建平衡列或一些PL/SQL技巧。Oracle窗口功能非常好用!在这种情况下,我们希望按交易日期的顺序将金额列从第一行加总到当前行。你可以用非常简单的语言来表达这一点:

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;
请注意: 窗口函数按…分区求和。。。订购人。。。射程带来魔力。在这种情况下,我们不会重新启动数据集的分区计算,因此我们可以跳过它。我们在窗口中包含一个orderby,以确保以正确的顺序求和值,但我们也将整个值集的orderby表示为正常值。你可以用谷歌搜索RANGE子句,但正如你所看到的,它是一种非常简单的语言


顺便说一下,使用CHAR作为事务符号是很尴尬的。我建议将其存储为带符号整数1和-1,这样您就可以简单地将金额乘以交易符号列。

谢谢!我会试试的。谢谢。这就是我要找的!这也可以作为插入吗?@mrbako如果这个答案有帮助,请随意将这个答案作为正确答案。对于insert语句,有一种更直接的方法可以简单地求和到目前为止的事务,例如insert into。。。选择col1、col2、sumamount from。。。。但是,我认为没有必要将余额存储在事务行中。如果您有一笔追溯交易怎么办?在这种情况下,所有后续行都将不正确。我会将账户总余额保存在一个单独的表中,然后使用类似这样的SQL将您的总余额显示为显示的一部分。最后一个问题。是否也可以将第一条记录(如100)上的起始余额相加,使我在第一行的余额为145?