Текущий баланс на таблицах объединения

Код ниже вычисляет текущий непогашенный остаток для таблиц ACCOUNT а также PAYMENT:

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

Оплата:

    +--------------+------------+----------+
    | 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   |
    +--------------+------------+----------+

Аккаунт:

    +--------------+-------------+---------------+
    | 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         |
    +--------------+------------+----------+----------------------+

Я хочу добавить таблицу скидок в расчете. Эта таблица имеет ту же структуру, что и таблица платежей.

скидка

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

Поэтому я решил добавить UNION по моему запросу ниже. Но возвращается неверно. ценности. Пожалуйста помоги

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

2 ответа

Сумма скидки не отражается в ваших расчетах.ob = a.loan_amount - сумма (b.amount), в которой объединение может быть необязательно, поскольку скидка - это отдельная таблица, вы можете просто присоединиться к ней и использовать сумму скидки, чтобы уменьшить loan_amount ob = (a.loan_amount- discount_amount) - сумма (b.amount)

Используйте другой INNER JOIN

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
Другие вопросы по тегам