Вы можете реализовать это в одном запросе SQL
select em.ExpNum
, nvl(ed.owed, 0) as owed
, nvl(ecc.cc_paid, 0) + em.CashAmt as paid
, nvl(ed.owed, 0) - (nvl(ecc.cc_paid, 0) + em.CashAmt) as diff
from ExpMast em
left join ( select ExpNum, sum(Amt) as owed
from ExpDet
group by ExpNum ) ed
on ed.ExpNum = em.ExpNum
left join ( select ExpNum, sum(Amt) as cc_paid
from ExpByCC
group by ExpNum ) ecc
on ecc.ExpNum = em.ExpNum
order by em.ExpNum
В этом коде используются внешние объединения, что позволяет отслеживать расходы до того, как данные будут отправлены, и, при необходимости, обрабатывать платежи по кредитным картам. Очевидно, мне пришлось сделать пару предположений о структуре таблицы и данных, поэтому вам может потребоваться настроить этот код, чтобы он работал так, как вам нужно.
Вот скрипта SQL .
Кроме того, вам следует избегать использования естественных объединений. Да, стандарт ANSI SQL поддерживает их, и да, полезно знать, что они существуют. Но в реальной жизни это просто ошибка, ожидающая своего появления.