Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
SiмbаTLM, про оконные (аналитические) функции почитай... судя по описанию тебе нужны [LEAD() OVER() | LAG() OVER], SUM() OVER(order by ...) |
22 янв 18, 04:41 [21125152] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |