Имеется таблица, в которой по счету на дату хранится остаток и ставка процентов годовых. Необходимо написать запрос, который рассчитает проценты за заданный период, данные будут сгруппированы по интервалам дат, когда остаток и ставка были неизменны.
Пример данных:
CREATE TABLE T_PRC (ACC NUMBER, DT DATE, REST NUMBER, PRC NUMBER ); COMMENT ON COLUMN T_PRC.ACC IS '№ счёта'; COMMENT ON COLUMN T_PRC.DT IS 'Дата'; COMMENT ON COLUMN T_PRC.REST IS 'Остаток'; COMMENT ON COLUMN T_PRC.PRC IS 'Ставка процентов годовых'; COMMENT ON TABLE T_PRC IS 'Счёт'; / INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('01.01.2014', 'dd.mm.yyyy'), 100000, 5); INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('02.01.2014', 'dd.mm.yyyy'), 100000, 5); INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('03.01.2014', 'dd.mm.yyyy'), 200000, 5); INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('04.01.2014', 'dd.mm.yyyy'), 200000, 5); INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('05.01.2014', 'dd.mm.yyyy'), 200000, 6); INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('06.01.2014', 'dd.mm.yyyy'), 100000, 5); INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('07.01.2014', 'dd.mm.yyyy'), 100000, 5); INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('08.01.2014', 'dd.mm.yyyy'), 100000, 5); INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('09.01.2014', 'dd.mm.yyyy'), 100000, 5); INSERT INTO t_prc p (p.acc, p.dt, p.rest, p.prc) VALUES (1, to_date('10.01.2014', 'dd.mm.yyyy'), 100000, 5); COMMIT WORK; /
Вариант запроса:
SELECT t2.dt_begin, t2.dt_end, t2.day, t2.rest, t2.prc, round(t2.rest * ((t2.day * t2.prc) / (100 * 365)), 2) AS percent_sum FROM (SELECT MIN(t1.dt) AS dt_begin, MAX(t1.dt) AS dt_end, COUNT(t1.d) AS DAY, t1.rest, t1.prc FROM (SELECT t_prc.dt, row_number() over(ORDER BY t_prc.dt) - row_number() over(PARTITION BY t_prc.rest, t_prc.prc ORDER BY t_prc.dt) AS d, t_prc.rest, t_prc.prc FROM t_prc) t1 GROUP BY t1.rest, t1.prc, t1.d) t2 ORDER BY dt_begin ASC; /
Результат:
DT_BEGIN DT_END DAYS REST PRC PERCENT_SUM 01.01.2014 02.01.2014 2 100000 5 27.4 03.01.2014 04.01.2014 2 200000 5 54.79 05.01.2014 05.01.2014 1 200000 6 32.88 06.01.2014 10.01.2014 5 100000 5 68.49
P.S.
Конфигурация СУБД — Oracle Database 11g Express Edition Release 11.2.0.2.0
IDE — PL/SQL Developer Version 11.0.6.1776