Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Включение в запрос предыдущих значений столбцов  [new]
SiмbаTLM
Member

Откуда:
Сообщений: 7
Всем добрый день,
SQL изучаю не так давно, так что вопрос "чайника")
Обычное построение гашения аннуитентного платежа

Есть таблица с данными по кредиту:
SELECT [Дата выдачи кредита]
,[Сумма выдачи, руб.]
,[Срок кредита (мес.)]
,[Ставка по кредиту]
FROM [График платежей].[dbo].[Данные]

Дата выдачи кредита Сумма выдачи, руб. Срок кредита (мес.) Ставка по кредиту
2017-01-01 1000000 12 15

Соотв. по данным нужно смоделировать другую таблицу:
Столбцы:
Остаток на начало периода
Остаток на конец периода
Сумма начисленных процентов
Объем выдач за период
Объем погашения за период

Ну и столбец по датам (кредит на 12 мес.)
янв.17
фев.17
мар.17
апр.17
май.17
июн.17
июл.17
авг.17
сен.17
окт.17
ноя.17
дек.17
янв.18

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

Значения за первые периоды (когда по сути еще ничего не гасится) завел, а дальше начались проблемы...
Когда пытаюсь вычитать значения начисленных процентов за прошлый период (SELECT LAG([Сумма начисленных процентов],1,0) OVER (ORDER BY [ID]) AS [Разница процентов] FROM [График платежей].[dbo].[График погашения]) - появляется ошибка:
"Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения."

Пробовал джойнить - не помогает.
Может кто-нибудь подскажет как это построить?)

Запрос ниже:

SELECT *
  FROM [График платежей].[dbo].[График погашения]
  UPDATE [dbo].[График погашения]
SET [Средневзвешенная ставка за период] = 15;
  UPDATE [dbo].[График погашения]
SET [Объем погашения за период] =  CASE
WHEN ID = 1
THEN 0
ELSE ((SELECT [Сумма выдачи, руб.] from [График платежей].[dbo].[Данные]) * (((15.00/100.00/12.00)+((15.00/100.00/12.00)/((POWER(1+(15.00/100.00/12.00),12)-1))))))
END
UPDATE [dbo].[График погашения]
SET [Объем выдач за период] = CASE 
WHEN ID = 1
THEN (SELECT [Сумма выдачи, руб.] from [График платежей].[dbo].[Данные])
ELSE 0
END
UPDATE [dbo].[График погашения]
SET [Остаток на начало периода] = CASE 
WHEN ID = 1 OR ID = 2
THEN (SELECT [Сумма выдачи, руб.] from [График платежей].[dbo].[Данные])
ELSE 0
END
UPDATE [dbo].[График погашения]
SET [Остаток на конец периода] = CASE 
WHEN ID = 1
THEN ((SELECT [Остаток на начало периода] from [График платежей].[dbo].[График погашения] WHERE ID=1)-(SELECT [Объем погашения за период] from [График платежей].[dbo].[График погашения] WHERE ID=1))
ELSE 1000000 - 500
END
UPDATE [dbo].[График погашения]
SET [Сумма начисленных процентов] = ((SELECT [Остаток на начало периода] from [График платежей].[dbo].[График погашения] WHERE ID=1)*15.00/100.00*31/365) WHERE ID=1
UPDATE [dbo].[График погашения]
SET [Сумма начисленных процентов] = ((SELECT [Остаток на начало периода] from [График платежей].[dbo].[График погашения] WHERE ID=2)*15.00/100.00*28/365) WHERE ID=2
UPDATE [dbo].[График погашения]
SET [Сумма начисленных процентов] = ((SELECT [Остаток на начало периода] from [График платежей].[dbo].[График погашения] WHERE ID=3)*15.00/100.00*31/365) WHERE ID=3
UPDATE [dbo].[График погашения]
SET [Сумма начисленных процентов] = ((SELECT [Остаток на начало периода] from [График платежей].[dbo].[График погашения] WHERE ID=4)*15.00/100.00*30/365) WHERE ID=4

SELECT LAG([Сумма начисленных процентов],1,0) OVER (ORDER BY [ID]) AS [Разница процентов] FROM [График платежей].[dbo].[График погашения]


Сообщение было отредактировано: 21 янв 18, 23:33
21 янв 18, 21:24    [21124860]     Ответить | Цитировать Сообщить модератору
 Re: Включение в запрос предыдущих значений столбцов  [new]
Добрый Э - Эх
Guest
SiмbаTLM,

про оконные (аналитические) функции почитай... судя по описанию тебе нужны [LEAD() OVER() | LAG() OVER], SUM() OVER(order by ...)
22 янв 18, 04:41    [21125152]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить