【问题标题】:Monthly cumulative differences calculation in postgrespostgres中的每月累积差异计算
【发布时间】:2022-01-17 20:53:09
【问题描述】:

我正在尝试在 postgres 中编写一个 sql 脚本,以查找总价格和还款金额的累积差异。我有两个表,如下所示。我已经完成了here 提供的解决方案,但它没有解决我的问题。

item table

item_id  cost_price    date_purchase
1        200           01-06-2019
2        300           10-07-2019
3        250           15-08-2019
4        400           10-09-2019

payment table
item id  payment       payment date
1          50           01-06-2019
1          40           20-06-2019
2          30           15-07-2019
1          60           17-07-2019
2          100          15-08-2019
3          90           17-08-2019
4          300          20-09-2019
1          50           25-09-2019

Expected result

Month                        Remaining amount
06_2019       (200 - 90) = 110
07_2019       (200+ 300) - (90 + 30 + 60) = 320
08_2019       (200+ 300 + 250) - (90 + 90 + 100 + 90) = 380
09_2019       (200 + 300 + 250 + 400) - (90 + 90 + 190 + 300 + 50) = 430





【问题讨论】:

  • 为什么它没有回答你的问题?怎么了?

标签: sql postgresql


【解决方案1】:

您可以通过使用 ORDER BY 月份的 WINDOWING 函数的 SUM 来做到这一点。但是给我们你的表的 DDL 以获得更多帮助......

【讨论】:

    【解决方案2】:

    由于您的示例忽略了结果中的 item_id,因此您可以将购买和付款合并到一个简单的分类帐中,然后使用窗口函数来获得运行总和:

    with ledger as (
      select to_char(date_purchase, 'YYYY-MM') as xact_month, cost_price as amount from item
      union all
      select to_char(payment_date, 'YYYY-MM'), payment * -1 from payment
    )
    select distinct xact_month as month, 
           sum(amount) over (order by xact_month) as remaining_amount
      from ledger;
    

    工作fiddle。

    【讨论】:

      【解决方案3】:

      就是这样:

      select distinct date_trunc('month',m.date_1),m.num_1 from (select to_date(b."payment date",'DD-MM-YYYY') as date_1,
      sum(a."cost_price"+coalesce((select sum("cost_price") from item_table c where 
                          date_trunc('month',to_date(a."date_purchase",'DD-MM-YYYY'))>date_trunc('month',to_date(c."date_purchase",'DD-MM-YYYY'))
                         ),0)-(coalesce((select sum("payment") from payment_table c where 
                          date_trunc('month',to_date(a."date_purchase",'DD-MM-YYYY'))>=date_trunc('month',to_date(c."payment date",'DD-MM-YYYY'))
                         ),0))) as num_1 from  item_table a,payment_table b
      where date_trunc('month',to_date(a."date_purchase",'DD-MM-YYYY'))
      =date_trunc('month',to_date(b."payment date",'DD-MM-YYYY'))
      group by 1 order by 1)m;
      

      请查看http://sqlfiddle.com/#!17/428874/37

      可能会给它一个绿色的勾号和一个赞成票..

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 1970-01-01
        • 2014-01-14
        • 2021-02-18
        • 1970-01-01
        • 2021-10-11
        • 2022-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多