【问题标题】:how to calculate balances in an accounting software using postgres window function如何使用 postgres 窗口函数计算会计软件中的余额
【发布时间】:2014-09-26 10:56:33
【问题描述】:

我遇到了与此相同的问题,但我使用的是 Postgres。

Calculate balance with mysql

有一个包含以下数据的表:

ID      In       Out 
1      100.00    0.00   
2       10.00    0.00   
3        0.00   70.00    
4        5.00    0.00    
5        0.00   60.00   
6       20.00    0.00     

现在我需要一个查询,它会给出以下结果:

ID      In       Out    Balance
1      100.00    0.00   100.00
2       10.00    0.00   110.00
3        0.00   70.00    40.00
4        5.00    0.00    45.00
5        0.00   60.00   -15.00
6       20.00    0.00     5.00

如何最好地处理“余额”计算。有人告诉我 postgres 中有窗口函数,如何使用 postgres 窗口函数来完成?

谢谢。

【问题讨论】:

    标签: sql database postgresql window-functions accounting


    【解决方案1】:
    select t.*, sum("In"-"Out") over(order by id) as balance
    from tbl t
    order by id
    

    小提琴: http://sqlfiddle.com/#!15/97dc5/2/0

    考虑更改列名“In”/“Out”,这样您就不需要将它们放在引号中。 (它们是保留字)

    如果您只想要一位客户 (customer_id = 2):

    select t.*, sum("In"-"Out") over(order by id) as balance
    from tbl t
    where customer_id = 2
    order by id
    

    如果您的查询要跨越多个客户,并且您希望每个客户都重新开始运行余额,您可以使用:

    select t.*, sum("In"-"Out") over( partition by customer_id
                                      order by customer_id, id ) as balance_by_cust
    from tbl t
    order by customer_id, id
    

    【讨论】:

    • 哇,真快!多谢。还有一个小问题,假设有一个customer_id,我只想查询和计算customer_id == 2的余额,该语句将如何?我无法让它工作:选择 t.*, sum(in-out) over(order by id) as balance where customer_id == "2" from tbl t order by id
    • @Axil 在 sql 中使用单个等号,请参阅我的编辑。 where 子句也在 from 子句之后。
    • 嗨,布赖恩,最后一个问题,如果可以的话,有没有办法使用相同的语句来更新表中的余额列。现在余额是虚拟列,假设表中确实有一个“余额”列,我希望您生成的所有这些值都更新到该特定行,类似于您显示它的方式。谢谢
    • @Axil 我不会在表中物理存储余额列,因为它是一个计算。您可能希望使用该列创建一个视图,该视图基本上是一个存储的 sql 语句。见postgresql.org/docs/9.2/static/sql-createview.html。否则,您将不断更新带有附加事务的表。最好使用上面的 sql 创建视图。
    • @Axil 这里是一个使用视图的例子。 sqlfiddle.com/#!15/058a2/1/0,创建视图后,使用上面的 sql,您可以像查询任何其他表一样查询该视图(基本上得到您想要的,但您不必不断更新它)。跨度>
    猜你喜欢
    • 1970-01-01
    • 2023-01-11
    • 2020-11-26
    • 2023-01-12
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多