Как получить неоплаченную сумму каждого счета за финансовые расходы? - PullRequest
0 голосов
/ 08 июня 2019

Я работаю над внедрением финансовых сборов, но не знаю, как получить неоплаченную сумму каждого счета. Я не новичок в SQL, однако эта проблема поставила меня в тупик. Прости меня, если я просто не искал должным образом.

Итак, допустим, у меня есть таблица счетов:

 id | amount   
----+--------------
 1  | 50.00         
 2  | 50.00      
 3  | 50.00     
 4  | 50.00    
 5  | 50.00

и таблица платежей:

amount   
--------------
50.00       
25.00   

Набор результатов должен быть таким:

 invoice_id | unpaid_amount   
------------+--------------       
 2          | 25.00      
 3          | 50.00     
 4          | 50.00     
 5          | 50.00 

Конечно, можно добавить еще немного для реализации финансовых расходов, но я думаю, что смогу получить остальное.

Редактировать: Извините, оплошность моя. Идентификаторы не связаны. Столбец идентификатора удаленного платежа.

Редактировать 2: Это фиктивные числа, реальные числа будут любыми, поэтому совпадения с суммами невозможны.

Редактировать 3: И здесь я создал SQL Fiddle , чтобы показать, что у меня есть, на основе второго ответа @GordonLinoff. Я был бы признателен за более чистый подход, чем придуманный мной SQL.

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Вы можете сделать с помощью LEFT JOIN и вычесть суммы из обеих таблиц.COALSECE здесь, чтобы предотвратить получение NULL при отсутствии платежа.

select
     i.id as invoice_id
    ,i.amount - coalesce(p.amount,0) as amount
from invoice i 
left join payments p
    on p.id = i.id

Если в вашем payments талбе может быть более одного платежа для счета, вы должны сгруппировать paymentsперед присоединением к invoice.

select
     i.id as invoice_id
    ,i.amount - coalesce(p.amount,0) as amount
from invoice i 
left join (select id, sum(amount) as amount  from payments group by id) p
    on p.id = i.id
0 голосов
/ 08 июня 2019

Я думаю, что вы хотите join:

select i.id as invoice_id,
       (i.amount - coalesce(p.amount, 0)) as net_amount
from invoice i left join
     payment p
     on i.id = p.id;

EDIT:

Или вы можете захотеть:

select i.*,
       (case when sum(i.amount) over (order by i.id) < p.amount 
             then i.amount
             else greatest(p.amount - sum(i.amount) over (order by i.id) + i.amount, 0)
        end) as amount_paid
from invoice i cross join
     (select sum(amount) as amount
      from payment
     ) p;

Здесь - это дБ <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...