Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разноска суммы. Нарастающий итог. / 9 сообщений из 9, страница 1 из 1
12.12.2017, 16:59:32
    #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
12.12.2017, 18:06:33
    #39568554
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разноска суммы. Нарастающий итог.
Cristiano_Rivaldo,

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

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

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

То есть Вы хотите, чтобы отрицательный остаток переносился в новый период и так далее до тех пор, пока не получите положительный остаток из суммы всех подряд идущих отрицательных остатков к последующему положительному?
...
Рейтинг: 0 / 0
12.12.2017, 19:52:37
    #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
13.12.2017, 08:51:24
    #39568774
Cristiano_Rivaldo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разноска суммы. Нарастающий итог.
Up
...
Рейтинг: 0 / 0
13.12.2017, 11:21:55
    #39568871
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разноска суммы. Нарастающий итог.
Cristiano_Rivaldo,

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

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

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


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