如何创建部分支付和未付款

时间:2016-10-04 08:03:37

标签: postgresql

我有2张如下表: -

Table: Invoice
InvDate     InvNo   InvAmount
01/01/2016  T0001   3000
02/01/2016  T0002   8000

Table: Payment
ResDate     ResType ResNo   ResAmount   InvNo
01/01/2016  C       R0001   3000        T0001
02/01/2016  P       R0002   2000        T0002
04/01/2016  P       R0003   2000        T0002   

我需要的输出如下: -

InvDate     InvNo   InvAmount   Cash    Partial Balance
01/01/2016  T0001   3000        3000    -       0
02/01/2016  T0002   8000        -       4000    4000

我试图将一个值放入新列现金,如果付款是现金,并且Sum(付款部分)在Partial上然后计算余额,如果仍未偿还,则我丢失了查询。

我不知道如何构建此查询..请帮助我。

1 个答案:

答案 0 :(得分:1)

SELECT i.invdate, i.invno, i.invamount,
       sum(CASE WHEN p.restype = 'C' THEN p.resamount END) AS cash,
       sum(CASE WHEN p.restype = 'P' THEN p.resamount END) AS partial,
       i.invamount - sum(p.resamount) AS balance
FROM invoice i
   JOIN payment p USING (invno)
GROUP BY i.invdate, i.invno, i.invamount
ORDER BY i.invdate;

┌────────────┬───────┬───────────┬─────────┬─────────┬─────────┐
│  invdate   │ invno │ invamount │  cash   │ partial │ balance │
├────────────┼───────┼───────────┼─────────┼─────────┼─────────┤
│ 2016-01-01 │ T0001 │   3000.00 │ 3000.00 │         │    0.00 │
│ 2016-02-01 │ T0002 │   8000.00 │         │ 4000.00 │ 4000.00 │
└────────────┴───────┴───────────┴─────────┴─────────┴─────────┘
(2 rows)