Еще вариант (более корректный). Берем полный долг на дату, но для обязательств, у которых срок погашения больше или равен определенной дате берется не сумма обязательства а сумма, оплаченная на эту дату.
т.е. предположим, есть обязательство на 100 т.р. от 01.11.16, срок погашения у него 20.11.16, однако к 07.11.16 мы уже 20 т.р. проплатили.
Получается: общий долг на 07.11 = 100 000 (сумма об-ва) - 20 000 (сумма платежа) = 80 000.
просроченный долг: 20 000 (сумма уже проплаченного на 07.11 по обязательству) - 20 000 (сумма платежа) = 0.
То есть, вычисляется более корректно.
В предыдущем варианте это фин. обязательство вообще не учитывалось (выкидывалось при отборе) и получалось, что сумма просроченных = - 20000 (платежи отбираются все на определенную дату)
SQL код:
select (sum(nvl(case when fin.calcenddate>=to_date('07.11.2016','DD.MM.YYYY') then supermag.get_doc_debt_on_date(to_date ('07.11.2016','DD.MM.YYYY'),d.doctype,d.docid) else d.acceptinsum end,0))-sum(nvl(d.ACCEPTOUTSUM,0))) from SVFinObligationAll d
join SUPERMAG.SVCompanies SUPPL on d.FinAgent=SUPPL.ID
left join SUPERMAG.SMFINOBLIGATION fin on FIN.DOCID=D.DOCID and FIN.DOCTYPE=d.doctype
where d.docstate=3
and d.FinAgent=SUPPL.ID and trim(UPPER(SUPPL.INN))=trim(UPPER('5029154179'))
and d.BEGINDATE<=to_date('07.11.2016','DD.MM.YYYY');
Однако проблема в том, что с учетом скудных познаний в SQL пришлось городить функцию.
SQL код:
--получение погашенного долга (сколько оплачено) по конкретному документу на дату (дата включается)
--дата (дата включается), тип документа, номер документа
create or replace function get_doc_debt_on_date(ADate in date, ADocType in supermag.smdocuments.doctype%type,ADocID in supermag.smdocuments.id%type)
return number
is
saldo NUMBER;
begin
select SUM(nvl(FL.LINKSUM,0)) into saldo from supermag.SVFINLINKALL FL where FL.DOCTYPE=ADocType and FL.ID=ADocID and FL.ENDDATE<=ADate;
return saldo;
end get_doc_debt_on_date;
/
commit;
Вопрос к знатокам - можно ли все вышеописанное таки одним запросом реализовать ?