2010-01-22 81 views
2

我有两个数据库表Fine和Fine_payment。 精有字段
* fine_id [pk]
* fine_amount。SQL计算(Oracle)

Fine_payment有场
* fine_payment_id [PK]
* fine_id
*支付金额

所以每精细可以有多个付款。我将如何选择那些尚未完全支付的罚款并显示未付款额?

Oracle DB。

回答

4
select fine_id, fine_amount 
--------------------------------------------------------------- 
-- add a coalesce here, in case "payments" returns a NULL match 
--------------------------------------------------------------- 
, (fine_amount - coalesce(payments.already_paid, 0)) as outstanding_amount 
from Fine left outer join 
(
    select fine_id 
    , sum(coalesce(payment_amount, 0)) as already_paid 
    from Fine_payment 
    group by fine_id 
) payments 
on Fine.fine_id = payments.fine_id 
where Fine.fine_amount <> coalesce(payments.already_paid, 0) 

编辑inner joinleft outer join

+0

谢谢,有小错字,应该合并(payment_amount,0)我想。 我如何修改这个以解决没有任何罚款付款的情况?我的第一个想法是留在外部联接,但这似乎并不奏效。 – Illotus 2010-01-22 11:57:50

+0

感谢您注意到 - 我会更正它。 LOJ也应该工作。 – davek 2010-01-22 12:26:03

1

,因为我不是在使用SQL中的一些非常先进的方法是多完美的替代,我有什么是below.it可能时间服用查询和我坚信我们可以调整。

SELECT a.fine_id,b.SUM_of_amount_paid,(a.fine_amount-b.SUM_of_amount_paid) amount_left_to_be_paid 
FROM 
    (SELECT fine_id,fine_amount FROM fine) a, 
    (SELECT fine_id,SUM(fine_payment_amount) SUM_of_amount_paid FROM fine_payment GROUP BY fine_id) b 
WHERE a.fine_id=b.fine_id 
AND 
(a.fine_amount-b.SUM_of_amount_paid) >0