powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / списания средств ежемесячно
17 сообщений из 17, страница 1 из 1
списания средств ежемесячно
    #39786607
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Имеется 1-ая таблица контракта:

- № контракта;
- Период контракта (Количество месяцев, например = 3 месяца)
- Сумма контракта (например = 2100);

Имеется 2-ая таблица контракта:

- № контракта;
- Оплаты по контракту (в разнобой, возможны и частичные оплаты, сумма всех оплат, к примеру = 950);

Списание происходит от 1-го к последнему месяцам!

Нужно получить примерно такой результат, например

№ контракта Период Сумма Оплачено Долг
----------------- ---------------- -------- ------------ ------
К001 1-ый месяц 700 700 0
К001 2-ой месяц 700 250 450
К001 3-ий месяц 700 0 700
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786616
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vuginetВсем привет!

Имеется 1-ая таблица контракта:

- № контракта;
- Период контракта (Количество месяцев, например = 3 месяца)
- Сумма контракта (например = 2100);

Имеется 2-ая таблица контракта:

- № контракта;
- Оплаты по контракту (в разнобой, возможны и частичные оплаты, сумма всех оплат, к примеру = 950);

Списание происходит от 1-го к последнему месяцам!

Нужно получить примерно такой результат, например

№ контракта Период Сумма Оплачено Долг
----------------- ---------------- -------- ------------ ------
К001 1-ый месяц 700 700 0
К001 2-ой месяц 700 250 450
К001 3-ий месяц 700 0 700


Оплаты велись в разные времена, и частично, например:

150
200
100
250
90
160
---------
Сумма = 950
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786622
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vuginet,

и к какому решению вы пришли? Что не получается?
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786629
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKvuginet,

и к какому решению вы пришли? Что не получается?

делю всё на 3 не то получается (

2100/3 950/3 Долг
----------- -------- --------

700 316,67 383,33
700 316,67 383,33
700 316,67 383,33
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786640
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vuginetTaPaKvuginet,

и к какому решению вы пришли? Что не получается?

делю всё на 3 не то получается (

2100/3 950/3 Долг
----------- -------- --------

700 316,67 383,33
700 316,67 383,33
700 316,67 383,33


нужно, чтобы

первые 700 закрыли бы - 1-ый месяц, если имеются ещё оплаты, то
950-700=250 === 250 списались бы со 2-го месяца и т.д.
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786670
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужны таблицы:

Контракт (уже есть, только сумму отсюда выкинуть, считать ее из следующей таблицы)

CONTR_ID№ контрактаПериод контракта=Количество месяцев111233

Суммы контрактов по месяцам
SUM_CONTR_BY_MONTH_IDCONTR_IDСумма111700211700311700

Оплаты (номер контракта отсюда выкинуть)
PAYMENT_IDСумма77950

Связь Оплаты и Суммы контрактов по месяцам
PAYMENT_IDSUM_CONTR_BY_MONTH_IDСумма771700772250

Тогда видно, что одна оплата может распределяться по нескольким месяцам контракта, и один месяц контракта может оплачиваться по частям многими оплатами.

А алгоритм заполнения таблицы связи уже должен смотреть, насколько оплачена каждая позиция контракта, и куда распределять очередную оплату.
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786675
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKvuginet,

и к какому решению вы пришли? Что не получается?


select t1.номер, t1.период, t1.сумма, sum(t2.оплата)/3

from table1 t1, table2 t2

where t1.контракт_ID= t1.контракт_ID

group by t1.номер, t1.период, t1.сумма
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786679
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cane Cat FisherНужны таблицы:

Контракт (уже есть, только сумму отсюда выкинуть, считать ее из следующей таблицы)

CONTR_ID№ контрактаПериод контракта=Количество месяцев111233

Суммы контрактов по месяцам
SUM_CONTR_BY_MONTH_IDCONTR_IDСумма111700211700311700

Оплаты (номер контракта отсюда выкинуть)
PAYMENT_IDСумма77950

Связь Оплаты и Суммы контрактов по месяцам
PAYMENT_IDSUM_CONTR_BY_MONTH_IDСумма771700772250

Тогда видно, что одна оплата может распределяться по нескольким месяцам контракта, и один месяц контракта может оплачиваться по частям многими оплатами.

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

Спасибо Вам преогромное за аналитику, но это я знаю, и у меня точно так, как Вы говорите.
Но как на MS SQL select написать?
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786688
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vuginetCane Cat FisherНужны таблицы:

Контракт (уже есть, только сумму отсюда выкинуть, считать ее из следующей таблицы)

CONTR_ID№ контрактаПериод контракта=Количество месяцев111233

Суммы контрактов по месяцам
SUM_CONTR_BY_MONTH_IDCONTR_IDСумма111700211700311700

Оплаты (номер контракта отсюда выкинуть)
PAYMENT_IDСумма77950

Связь Оплаты и Суммы контрактов по месяцам
PAYMENT_IDSUM_CONTR_BY_MONTH_IDСумма771700772250

Тогда видно, что одна оплата может распределяться по нескольким месяцам контракта, и один месяц контракта может оплачиваться по частям многими оплатами.

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

Спасибо Вам преогромное за аналитику, но это я знаю, и у меня точно так, как Вы говорите.
Но как на MS SQL select написать?


как Вот этот результат заполучить?

№ контракта Период Сумма Оплачено Долг
----------------- ---------------- -------- ------------ ------
К001 1-ый месяц 700 700 0
К001 2-ой месяц 700 250 450
К001 3-ий месяц 700 0 700
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786718
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vuginet,

долг накопительный что-ли? почему не 1150 в последнем месяце
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786756
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKvuginet,

долг накопительный что-ли? почему не 1150 в последнем месяце

Не накопительный, но на руки выданная таблица оплат имеетя,
а плательщик как хочет платит, никаких пений не начисляется,
тупо платит сколько хочет, и, несмотря на его частичные платежи,
месяц закрывается, если полностью оплата произведена. А лишняя часть
оплаты начинает гасить следующий в очереди не погашённый месяц.
Т.е., закрыл первый 700 перешёл на следующий.
Проблема моя состоит в том, что я не могу рекурсивно показать в select-е
таблично - результат. Программно могу, но как через select показать?
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786759
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vuginetTaPaKvuginet,

долг накопительный что-ли? почему не 1150 в последнем месяце

Не накопительный, но на руки выданная таблица оплат имеетя,
а плательщик как хочет платит, никаких пений не начисляется,
тупо платит сколько хочет, и, несмотря на его частичные платежи,
месяц закрывается, если полностью оплата произведена. А лишняя часть
оплаты начинает гасить следующий в очереди не погашённый месяц.
Т.е., закрыл первый 700 перешёл на следующий.
Проблема моя состоит в том, что я не могу рекурсивно показать в select-е
таблично - результат. Программно могу, но как через select показать?
почему долг 700, если в третьем месяце долг 1150
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786766
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKvuginetпропущено...


Не накопительный, но на руки выданная таблица оплат имеетя,
а плательщик как хочет платит, никаких пений не начисляется,
тупо платит сколько хочет, и, несмотря на его частичные платежи,
месяц закрывается, если полностью оплата произведена. А лишняя часть
оплаты начинает гасить следующий в очереди не погашённый месяц.
Т.е., закрыл первый 700 перешёл на следующий.
Проблема моя состоит в том, что я не могу рекурсивно показать в select-е
таблично - результат. Программно могу, но как через select показать?
почему долг 700, если в третьем месяце долг 1150

Вы правы, если посмотреть в суммарном виде на долг, то это = 1150,
мне не нужно SUM(долг) вытащить, это не проблема, нужно таблично показать
Сумма Оплачено Долг
700 700 0
700 250 450
700 0 700
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786803
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vuginet,

причёсывать лень, всё сводится к теме накопительного итога

Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
;WITH a AS 
(
	SELECT	[Id] = 1, [Suma] = 2100,	[Cnt]	=  3
), opl AS
(
	SELECT 
	*
	FROM (VALUES		
		(1, 150),
		(1, 200),
		(1, 100),
		(1, 250),
		(1, 90 ),
		(1, 160)
	) as val(id,a)
), dolg AS
(
	SELECT  
		a.*,
		M,
		plat = a.Suma/Cnt,
		dolg = SUM(a.Suma/Cnt) OVER (PARTITION BY a.Id ORDER BY M) - FSuma 
	FROM a
	CROSS APPLY
	(
		SELECT number + 1 as M
		FROM master..spt_values
		WHERE Type = 'P'	AND
		Number < a.Cnt
	)	b
	CROSS APPLY
	(
		SELECT 
			Id,
			SUM(a) as FSuma
		
		FROM opl	GROUP BY Id
	) AS C
)
SELECT 
	Id,
	Suma,
	M,
	CASE 
		WHEN plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END) < 0 THEN 0 
		ELSE plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END)
	END
FROM	dolg


...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786806
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKvuginet,

причёсывать лень, всё сводится к теме накопительного итога

Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
;WITH a AS 
(
	SELECT	[Id] = 1, [Suma] = 2100,	[Cnt]	=  3
), opl AS
(
	SELECT 
	*
	FROM (VALUES		
		(1, 150),
		(1, 200),
		(1, 100),
		(1, 250),
		(1, 90 ),
		(1, 160)
	) as val(id,a)
), dolg AS
(
	SELECT  
		a.*,
		M,
		plat = a.Suma/Cnt,
		dolg = SUM(a.Suma/Cnt) OVER (PARTITION BY a.Id ORDER BY M) - FSuma 
	FROM a
	CROSS APPLY
	(
		SELECT number + 1 as M
		FROM master..spt_values
		WHERE Type = 'P'	AND
		Number < a.Cnt
	)	b
	CROSS APPLY
	(
		SELECT 
			Id,
			SUM(a) as FSuma
		
		FROM opl	GROUP BY Id
	) AS C
)
SELECT 
	Id,
	Suma,
	M,
	CASE 
		WHEN plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END) < 0 THEN 0 
		ELSE plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END)
	END
FROM	dolg




Спасибо большое, что-то вроде этого, я подгоню всё это под свой селект, а потом сообщу, Спасибо Преогромное!!!
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39786828
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vuginetTaPaKvuginet,

причёсывать лень, всё сводится к теме накопительного итога

Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
;WITH a AS 
(
	SELECT	[Id] = 1, [Suma] = 2100,	[Cnt]	=  3
), opl AS
(
	SELECT 
	*
	FROM (VALUES		
		(1, 150),
		(1, 200),
		(1, 100),
		(1, 250),
		(1, 90 ),
		(1, 160)
	) as val(id,a)
), dolg AS
(
	SELECT  
		a.*,
		M,
		plat = a.Suma/Cnt,
		dolg = SUM(a.Suma/Cnt) OVER (PARTITION BY a.Id ORDER BY M) - FSuma 
	FROM a
	CROSS APPLY
	(
		SELECT number + 1 as M
		FROM master..spt_values
		WHERE Type = 'P'	AND
		Number < a.Cnt
	)	b
	CROSS APPLY
	(
		SELECT 
			Id,
			SUM(a) as FSuma
		
		FROM opl	GROUP BY Id
	) AS C
)
SELECT 
	Id,
	Suma,
	M,
	CASE 
		WHEN plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END) < 0 THEN 0 
		ELSE plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END)
	END
FROM	dolg




Спасибо большое, что-то вроде этого, я подгоню всё это под свой селект, а потом сообщу, Спасибо Преогромное!!!

Чуточку поправил,


Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
;WITH a AS 
(
	SELECT	[Id] = 1, [Suma] = 2100,	[Cnt]	=  3
), opl AS
(
	SELECT 
	*
	FROM (VALUES		
		(1, 150),
		(1, 200),
		(1, 100),
		(1, 250),
		(1, 90 ),
		(1, 160)
	) as val(id,a)
), dolg AS
(
	SELECT  
		a.*,
		M,
		plat = a.Suma/Cnt,
		dolg = SUM(a.Suma/Cnt) OVER (PARTITION BY a.Id ORDER BY M) - FSuma 
	FROM a
	CROSS APPLY
	(
		SELECT number + 1 as M
		FROM master..spt_values
		WHERE Type = 'P'	AND
		Number < a.Cnt
	)	b
	CROSS APPLY
	(
		SELECT 
			Id,
			SUM(a) as FSuma
		
		FROM opl	GROUP BY Id
	) AS C
)
SELECT 
	Id,
    M,
	Suma/Cnt as Summa,
	CASE 
		WHEN plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END) < 0 THEN 0 
		ELSE plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END) 
	END  AS Oplata,

    Suma/Cnt - (CASE 
		WHEN plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END) < 0 THEN 0 
		ELSE plat - (CASE WHEN dolg < 0 THEN 0 ELSE dolg END) 
	END) as Dolg
FROM	dolg
...
Рейтинг: 0 / 0
списания средств ежемесячно
    #39787892
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vuginet,

А можно как-то While select использовать?

Типа этого:


Оплата=SUM(таблица оплат)

while Оплата> 0
begin
case
when (Оплата > 0) and (Оплата > Долг)

then Долг=0

else Долг=Долг - Оплата

Оплата=Оплата - Долг
end
end
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / списания средств ежемесячно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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