2017-08-30 4 views
0

Der folgende Code berechnet den laufenden ausstehenden Betrag für die Tabellen ACCOUNT und PAYMENT:Lauf Gleichgewicht auf Union Tabellen

select 
    b.payment_date,  
    a.account_no, a.accountname, a.loan_amount, 
    b.amount, 
    ob = a.loan_amount - sum(b.amount) over (partition by b.account_no order by b.payment_date) 
from 
    account a 
inner join 
    (select * from payment) b on a.account_no = b.account_no 
order by 
    a.account_no, b.payment_date 

Zahlung:

+--------------+------------+----------+ 
    | payment_date | account_no | amount | 
    +--------------+------------+----------+ 
    | 2017-08-10 | 123456789 | 5000 | 
    | 2017-08-15 | 987654321 | 3000 | 
    | 2017-09-15 | 987654321 | 3000 | 
    | 2017-10-11 | 123456789 | 4000 | 
    | 2017-10-16 | 987654321 | 3500 | 
    | 2017-11-10 | 123456789 | 3000 | 
    | 2017-11-15 | 987654321 | 2500 | 
    +--------------+------------+----------+ 

Konto:

+--------------+-------------+---------------+ 
    | account_no | accountname | loan_amount | 
    +--------------+-------------+---------------+ 
    | 123456789 |  John | 15000  | 
    | 987654321 |  Jane | 20000  | 
    +--------------+-------------+---------------+ 

QUERY RESULT:

+--------------+------------+----------+----------------------+ 
    | payment_date | account_no | amount | outstanding_balance | 
    +--------------+------------+----------+----------------------+ 
    | 2017-08-10 | 123456789 | 5000 |  10000   | 
    | 2017-10-11 | 123456789 | 4000 |   6000   | 
    | 2017-11-10 | 123456789 | 3000 |   3000   | 
    | 2017-08-15 | 987654321 | 3000 |  17000   | 
    | 2017-09-15 | 987654321 | 3000 |  14000   | 
    | 2017-10-16 | 987654321 | 3500 |  11500   | 
    | 2017-11-15 | 987654321 | 2500 |   9000   | 
    +--------------+------------+----------+----------------------+ 

Ich möchte Discount Tabelle in der Berechnung hinzuzufügen. Diese Tabelle enthält dieselbe Struktur wie die Tabelle Zahlung.

Discount

+--------------+------------+----------+ 
    | payment_date | account_no | amount | 
    +--------------+------------+----------+ 
    | 2017-08-10 | 123456789 | 100 | 
    | 2017-08-15 | 987654321 | 100 | 
    | 2017-09-15 | 987654321 | 100 | 
    +--------------+------------+----------+ 

So entschied ich mich unter eine UNION auf meine Abfrage hinzuzufügen. Aber es kommt falsch zurück. Werte. Bitte helfen

select 
    b.payment_date, 
    a.account_no, a.accountname, a.loan_amount, 
    b.amount, 
    ob = a.loan_amount - sum(b.amount) over (partition by b.account_no order by b.payment_date) 
from 
    account a 
inner join 
    (select * from payment union select * from discount) b on a.account_no = b.account_no 
order by 
    a.account_no, b.payment_date 
+0

Könnten Sie einen Rextester mit Tabellendefinitionen und einigen Testdaten hinzufügen? wäre einfacher zu reproduzieren und für uns zu testen –

Antwort

0

Verwenden Sie ein weiteres INNER

select 
    b.payment_date, 
    a.account_no, 
    a.loan_amount, 
    b.amount, 
    ob = a.loan_amount - sum(b.amount) over (partition by b.account_no order by b.payment_date), 
    d.amount 
from 
    account a 
inner join 
    payment b on a.account_no = b.account_no 
inner join 
    discount d on (d.account_no = b.account_no and d.payment_date = b.payment_date) 
order by 
    a.account_no, b.payment_date 
0

der Rabattbetrag reflektieren nicht in Ihrer Berechnung JOIN. ob = a.loan_amount - Summe (b.amount) Sie brauchen nicht unbedingt die Union, da Rabatt eine separate Tabelle ist, können Sie nur innerlich der Tabelle beitreten und den Rabattbetrag verwenden, um die loan_amount ob = zu reduzieren (a.loan_amount- discount_amount) - sum (b.mount)