powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разноска суммы. Нарастающий итог.
9 сообщений из 9, страница 1 из 1
Разноска суммы. Нарастающий итог.
    #39568479
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Раньше вроде бы такие задачи легко решал, но ,видимо, годы дают о себе знать :)
Нужно сумму разнести на строки. В строках есть как и положительное так и отрицательные суммы.
Результатом должны быть строки с рассчитанным количеством для каждой строки. Рассчитанное кол-во может быть меньше исходной суммы в строке - главное чтобы общая сумма по строкам не превышало заявленной разносимой суммы.
Есть еще один нюанс - в результат должны попасть только те платежи, чья сумма в периоде больше 0. Если же сумма по периоду меньше нуля - то она должна уменьшить сумму предыдущего периода или последующего (без разницы) с пересчитанным количеством в этих периодах.
Желательно все это сделать красиво - одним запросом :).
Код: 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.
DECLARE @N_Sum FLOAT = 7.3  -- сумма для разнесения

;WITH t (ID,N_SUM,d_post_date,n_period) AS 
	(
		SELECT  1 ID,		-- PK
				2 N_SUM,	-- сумма
				CONVERT(SMALLDATETIME,'20171001') d_post_date, --  дата
				201710 n_period   -- период (для упрощения)
		UNION ALL
		SELECT 2 , 1 N_SUM, CONVERT(SMALLDATETIME,'20171002') d_post_date,201710 n_period
		UNION ALL
		SELECT 3 ,  3 N_SUM, CONVERT(SMALLDATETIME,'20171102') d_post_date,201711 n_period
		UNION ALL
		SELECT 5 ,  -4 N_SUM, CONVERT(SMALLDATETIME,'20171103') d_post_date,201711 n_period
		UNION ALL
		SELECT 4 , 5 N_SUM, CONVERT(SMALLDATETIME,'20171203') d_post_date,201712 n_period
		UNION ALL
		SELECT 6 LINK, 1 N_SUM, CONVERT(SMALLDATETIME,'20171204') d_post_date,201712 n_period
	
	)
	SELECT	t.*,
			CASE	WHEN t.sum_by_step < t.n_need AND t.sum_by_step <= sum_by_period  THEN t.N_SUM 
					WHEN t.sum_by_step < t.n_need AND t.sum_by_step > sum_by_period  THEN t.sum_period 
					WHEN t.sum_by_step >= t.n_need AND t.N_SUM >= t.n_need AND t.n_need <= t.sum_period THEN t.n_need
					WHEN t.sum_by_step >= t.n_need AND t.N_SUM >= t.n_need AND t.n_need > t.sum_period THEN t.sum_period
					WHEN t.sum_by_step >= t.n_need AND t.N_SUM < t.n_need  and t.N_SUM <= t.sum_period THEN  t.N_SUM
					WHEN t.sum_by_step >= t.n_need AND t.N_SUM < t.n_need  and t.N_SUM > t.sum_period THEN  t.sum_period
			END   n_quant
	FROM (
			SELECT	T.*,
					@N_Sum - ISNULL(LAG(t.sum_by_step) OVER (ORDER BY d_post_date,N_SUM DESC ,ID),0) n_need  -- необходимое кол-во
			FROM  (
				SELECT	*,
						SUM(N_SUM) OVER (ORDER BY d_post_date,N_SUM DESC ,ID)			sum_by_step, -- нарастающий итог
						SUM(N_SUM) OVER (ORDER BY n_period )							sum_by_period, -- нарастающий итог в пределах периода
						SUM(N_SUM) OVER (PARTITION BY n_period ORDER BY n_period)		sum_period -- сумма по периоду
				
				FROM T
				WHERE N_SUM <> 0
				) t	
			WHERE t.sum_period > 0	
		) t


Но мой вариант кривоват так как не правильно анализируется отрицательный остаток в периоде.
Спасибо.
...
Рейтинг: 0 / 0
Разноска суммы. Нарастающий итог.
    #39568554
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cristiano_Rivaldo,

варианты расчета нарастающего итога есть в FAQ форума.
...
Рейтинг: 0 / 0
Разноска суммы. Нарастающий итог.
    #39568575
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Эта задача не на расчет , а на использование нарастающего итога.
...
Рейтинг: 0 / 0
Разноска суммы. Нарастающий итог.
    #39568602
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cristiano_RivaldoРезультатом должны быть строки с рассчитанным количеством для каждой строки. Рассчитанное кол-во может быть меньше исходной суммы в строке - главное чтобы общая сумма по строкам не превышало заявленной разносимой суммы.

Забыл уточнить.Строки с отрицательными суммами не должны попасть в результат.
...
Рейтинг: 0 / 0
Разноска суммы. Нарастающий итог.
    #39568607
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cristiano_Rivaldo,

То есть Вы хотите, чтобы отрицательный остаток переносился в новый период и так далее до тех пор, пока не получите положительный остаток из суммы всех подряд идущих отрицательных остатков к последующему положительному?
...
Рейтинг: 0 / 0
Разноска суммы. Нарастающий итог.
    #39568633
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Отрицательный остаток - это уменьшение общей суммы последующего (или предыдущего) периода, которую нужно учитывать при определении необходимого кол-ва для разнесения. Например для примера, который я приводил один из вариантов может выглядеть так:
Код: sql
1.
2.
3.
4.
5.
id n_quant
1   2
2   1
4   4    -- не 5, а 4  потому что за прошлый период сумма = -1
6   0.3
...
Рейтинг: 0 / 0
Разноска суммы. Нарастающий итог.
    #39568774
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Up
...
Рейтинг: 0 / 0
Разноска суммы. Нарастающий итог.
    #39568871
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cristiano_Rivaldo,

непонятно почему
автор4 4 -- не 5, а 4 потому что за прошлый период сумма = -1

Если сложить с предыдущим значением, получается 1.
...
Рейтинг: 0 / 0
Разноска суммы. Нарастающий итог.
    #39568898
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

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


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