Cześć!
Chciałbym prosić o pomoc z poniższym problemem.
Przyszło mi napisać w T-SQL kalkulator odsetek ustawowych, który dostaje jedną należność z kwotą i terminem, tabelę wpłat wraz z kwotą i datą_wykonania oraz tabelę stawek odsetek ustawowych. Ma to realizować podobną funkcję do tego, tylko dla wielu kwot na wejściu: http://www.kalkulatory.gofin.pl/Kalkulator-odsetek-ustawowych,12.html
Problem z naliczaniem odsetek ustawowych jest - jak pewnie wszyscy chociaż trochę z tematem zaznajomieni wiedzą - niestety taki, że musimy przechowywać podstawę długu osobno i odsetki osobno (ponieważ od odsetek nie liczy się odsetek pochodnych), a przy każdej wpłacie najpierw pomniejszać kwotę odsetek a potem dopiero podstawę długu. Nie da się liczyć jednego bez drugiego, ponieważ w jawny sposób wyliczanie jednej kolumny opiera się na wartościach wcześniejszych tej i poprzedniej.
Rodzi się pytanie, jak w T-SQL (wersja tak naprawdę nie gra roli, aktualnie korzystam z MS SQL Server 2014) to zrealizować. Agregaty z OVER niestety nie pozwalają na odwoływanie się do samych siebie, a jednym z wymogów jest niestosowanie nic poza DQL, więc wszelkie kursory i pętle odpadają, wszystko ma być zrobione selectami. Ze swojej strony trochę nagiąłem wymóg zadania, tworząc funkcje inline, ponieważ inaczej kodu powstałoby o wiele za dużo, a wydajność na tym nie traci.
Schemat bazy:
CREATE TABLE stawki (
dzien DATE NOT NULL PRIMARY KEY,
stawka DECIMAL NULL,
);
CREATE TABLE naleznosci (
id INTEGER NOT NULL PRIMARY KEY,
kwota DECIMAL NULL,
termin DATE NULL
);
CREATE TABLE wplaty (
id INTEGER NOT NULL PRIMARY KEY,
naleznosci_id INTEGER NOT NULL,
kwota DECIMAL NULL,
data_wplaty DATE NULL,
FOREIGN KEY(naleznosci_id)
REFERENCES naleznosci(id)
);
Trochę insertów do wygenerowania sensownej zawartości:
http://pastebin.com/e1wG8paa (do testów polecam zwłaszcza 24-28)
Funkcje inline, nie wszystkie wykorzystywane:
http://pastebin.com/8Bw7fvKC
Aktualna wersja skryptu generującego tabelę (jest tam sporo niepotrzebnych kolumn, ale tak łatwiej mi było pracować):
http://pastebin.com/RUkzv2Zw
Proszę o jakieś wskazówki. Z góry dzięki!