powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Включение в запрос предыдущих значений столбцов
2 сообщений из 2, страница 1 из 1
Включение в запрос предыдущих значений столбцов
    #39587937
SiмbаTLM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день,
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].[График погашения]) - появляется ошибка:
"Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения."

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

Запрос ниже:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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].[График погашения]
...
Рейтинг: 0 / 0
Включение в запрос предыдущих значений столбцов
    #39588012
SiмbаTLM,

про оконные (аналитические) функции почитай... судя по описанию тебе нужны [LEAD() OVER() | LAG() OVER], SUM() OVER(order by ...)
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Включение в запрос предыдущих значений столбцов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]