Poniżej zamieszczam kolejny przykład wykorzystania klauzuli model w wersji iteracyjnej, który przelicza wynagrodzenia brutto z umowy o pracę na poszczególne składniki po stronie pracownika w tym kwotę netto. Nie obsługuje progresji podatkowej ani ograniczenia rocznej podstawy
wymiaru składek na ubezpieczenie
emerytalne i rentowe (tzw.
trzydziestokrotności prognozowanego
przeciętnego wynagrodzenia
miesięcznego w gospodarce
narodowej na dany rok
kalendarzowy).
Istotą przykładu jest pokazanie w jaki elegancki sposób, zbliżony do obliczeń w MS Excel, można przedstawić niektóre obliczenia finansowe, a zwłaszcza odwoływanie się do wcześniej obliczonych komórek. Zapis taki jest intuicyjny i łatwy do modyfikacji..Arkusz jest jednowymiarowy w ujęciu klauzuli model, podstawową miarą (do modyfikowania przez użytkownika) jest kwota brutto zaznaczona na zielono. Użytkownik w łatwy sposób może dodawać własne miary np. obciążenia po stronie pracodawcy lub w inny sposób rozszerzyć poniższe zapytanie.
SELECT i lp,
DATA_WYPLATY AS "Data wypłaty" ,
KWOTA_BRUTTO,
SKLADKA_EMERYTALNA_PRACOWNIK,
SKLADKA_RENTOWA_PRACOWNIK,
SKLADKA_WYPADKOWA_PRACOWNIK,
SKLADKI_PRACOWNIK_RAZEM,
DOCHOD_PRACOWNIKA,
SKLADKA_ZDROWOTNA ,
ZALICZKA_PODATEK,
WYNAGRODZENIE_NETTO
FROM (SELECT 1 FROM DUAL)
MODEL
DIMENSION BY (0 d)
MEASURES (6000 KWOTA_BRUTTO,
TO_DATE( '2015-01-01', 'YYYY-MM-DD') DATA_WYPLATY , 0 i,
0 SKLADKA_EMERYTALNA_PRACOWNIK,
0 SKLADKA_RENTOWA_PRACOWNIK,
0 SKLADKA_WYPADKOWA_PRACOWNIK,
0 SKLADKI_PRACOWNIK_RAZEM,
111.25 KOSZT_UZYSKANIA_PRZYCHODU /*Pracownik niedojeżdżający*/ ,
0 DOCHOD_PRACOWNIKA,
0 SKLADKA_ZDROWOTNA,
0 ZALICZKA_PODATEK,
0 WYNAGRODZENIE_NETTO )
RULES
ITERATE (100) UNTIL (ITERATION_NUMBER >= 11)
(
i[ITERATION_NUMBER] = ITERATION_NUMBER +1,
DATA_WYPLATY [ITERATION_NUMBER ] = LAST_DAY(DECODE( DATA_WYPLATY [ITERATION_NUMBER -1], NULL, DATA_WYPLATY [ITERATION_NUMBER],
ADD_MONTHS( DATA_WYPLATY [ITERATION_NUMBER -1], 1))),
KWOTA_BRUTTO[ITERATION_NUMBER ] = KWOTA_BRUTTO[ 0 ],
SKLADKA_EMERYTALNA_PRACOWNIK[ ITERATION_NUMBER ] = ROUND(KWOTA_BRUTTO[ITERATION_NUMBER ] * 0.0976, 2),
SKLADKA_RENTOWA_PRACOWNIK[ ITERATION_NUMBER ] = ROUND(KWOTA_BRUTTO[ITERATION_NUMBER ] * 0.015, 2),
SKLADKA_WYPADKOWA_PRACOWNIK[ ITERATION_NUMBER ] = ROUND(KWOTA_BRUTTO[ITERATION_NUMBER ] * 0.0245, 2) ,
SKLADKI_PRACOWNIK_RAZEM[ITERATION_NUMBER ]
= SKLADKA_EMERYTALNA_PRACOWNIK[ ITERATION_NUMBER ] + SKLADKA_RENTOWA_PRACOWNIK[ ITERATION_NUMBER ]
+SKLADKA_WYPADKOWA_PRACOWNIK[ ITERATION_NUMBER ],
DOCHOD_PRACOWNIKA[ITERATION_NUMBER ] = ROUND( KWOTA_BRUTTO[ITERATION_NUMBER ] -SKLADKI_PRACOWNIK_RAZEM[ITERATION_NUMBER ] - KOSZT_UZYSKANIA_PRZYCHODU[0]),
SKLADKA_ZDROWOTNA[ITERATION_NUMBER ] = ROUND( (KWOTA_BRUTTO[ITERATION_NUMBER ] - SKLADKI_PRACOWNIK_RAZEM[0]) * 0.09, 2),
ZALICZKA_PODATEK[ITERATION_NUMBER ] = ROUND(DOCHOD_PRACOWNIKA[ITERATION_NUMBER ] * 0.18 - 46.33 - ROUND( (DOCHOD_PRACOWNIKA[ITERATION_NUMBER ] + KOSZT_UZYSKANIA_PRZYCHODU[0]) * 0.0775)),
WYNAGRODZENIE_NETTO[ITERATION_NUMBER ]= KWOTA_BRUTTO [ITERATION_NUMBER ] - SKLADKI_PRACOWNIK_RAZEM[ITERATION_NUMBER ] - SKLADKA_ZDROWOTNA[ITERATION_NUMBER ] - ZALICZKA_PODATEK[ITERATION_NUMBER ]
)