我有两个数据库表Fine和Fine_payment。 精有字段
* fine_id [pk]
* fine_amount。SQL计算(Oracle)
Fine_payment有场
* fine_payment_id [PK]
* fine_id
*支付金额
所以每精细可以有多个付款。我将如何选择那些尚未完全支付的罚款并显示未付款额?
Oracle DB。
我有两个数据库表Fine和Fine_payment。 精有字段
* fine_id [pk]
* fine_amount。SQL计算(Oracle)
Fine_payment有场
* fine_payment_id [PK]
* fine_id
*支付金额
所以每精细可以有多个付款。我将如何选择那些尚未完全支付的罚款并显示未付款额?
Oracle DB。
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 join
与left outer join
,因为我不是在使用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
谢谢,有小错字,应该合并(payment_amount,0)我想。 我如何修改这个以解决没有任何罚款付款的情况?我的第一个想法是留在外部联接,但这似乎并不奏效。 – Illotus 2010-01-22 11:57:50
感谢您注意到 - 我会更正它。 LOJ也应该工作。 – davek 2010-01-22 12:26:03