2010-01-22 2 views
2

내가 이dB 테이블 파인과 Fine_payment 있습니다. 미세 필드
* fine_id [PK]
* fine_amount있다.SQL 계산 (오라클)

는 Fine_payment는 필드가
* fine_payment_id [PK]
* fine_id
*

지급액

그래서 모든 미세 여러 지불을 할 수 있습니다. 전액을 지불하지 않은 벌금을 선택하고 미납 금액을 표시하려면 어떻게해야합니까?

오라클 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 join below.it 시간이 복용 할 수있는 내가 그 정도 완벽한 SQL에서 일부 아니라 고급 방법을 사용하는데 아닙니다으로 left outer join

+0

감사합니다. 약간의 오타가 있습니다. 합치면 (payment_amount, 0) 제 생각입니다. 어떻게이 벌금에 대한 지불이 아닌 경우를 설명하기 위해 수정할 수있는? 내 첫 번째 생각은 외부 조인으로 남았지 만 그건 효과가없는 것 같습니다. – Illotus

+0

고맙다는 것에 대해 고마워요. 나는 바로 잡을 것입니다. LOJ는 일해야합니다. – davek

1

로 대체, 내가 뭘해야하는 것은 쿼리와 나는 우리가 그것을 조정할 수 있다고 강력히 믿는다.

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