Процент годовых

Имеется таблица, в которой по счету на дату хранится остаток и ставка процентов годовых. Необходимо написать запрос, который рассчитает проценты за заданный период, данные будут сгруппированы по интервалам дат, когда остаток и ставка были неизменны.

Пример данных:

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

Tags: ,

Comments are closed.