0

テーブル:

cust table:    
   cust_id, name, etc    

bill table:    
   bill_id, cust_id, amt, due_date, status (open/closed)

payment table:    
   payment_id, bill_id, amt etc

お客様は複数回の分割払いで 1 つの請求書を決済できます。したがって、1 つの bill_id が payment_ids に関連付けられる場合があります。

このレコードセットを生成できません:


cust_id | 支払期日


「due amt」は、すべての bill.amts の合計です - すべての payment.amts の合計で、ステータスがオープンです。

請求表

bill_id cust_id     amt     status
1       18          200     open
2       18          200     open
3       17          200     open
4       17          200     open
5       17          200     open
6       17          200     closed

支払い表

payment_id  bill_id cust_id amt
1           1       18      50
2           2       18      40
3           3       17      10

期待される出力

cust_id     due_amt         hint/how
17          590             (600-10) .. 600 -> because one is closed
18          310             (400-(50+40))
4

1 に答える 1

2
select c.cust_id, sum(b.amt) - sum(p.amt) as due_amt
from cust c
left join bill b on b.cust_id = c.cust_id and b.status = 'open'
left join payment p on p.bill_id = b.bill_id
group by c.cust_id

SQLFiddle デモ

于 2013-08-17T16:54:53.933 に答える