powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Раскинуть сумму между строками
4 сообщений из 4, страница 1 из 1
Раскинуть сумму между строками
    #39999771
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, может подскажите как решить данную задачу, сервер 2016
Из столбца kg, сумму необходимо раскинуть по дате или по row_id, но вычитая на каждой строке, как бы смотреть на результат из предыдущей строки.
row_id id availability_datetime reserved_kg kg результат 1 570013 2020-09-17 10:09:25.000 1 300 1 869 1 300 2 570013 2020-09-17 06:15:56.000 385 385 3 570013 2020-09-17 06:13:47.000 296 184 4 570013 2020-09-17 06:12:21.000 119 1 554444 2020-09-17 10:09:25.000 3 300 2 869 2 869 2 554444 2020-09-17 06:15:56.000 385 3 554444 2020-09-17 06:13:47.000 296 4 554444 2020-09-17 06:12:21.000 119
...
Рейтинг: 0 / 0
Раскинуть сумму между строками
    #39999795
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha,

sum() over() + case
...
Рейтинг: 0 / 0
Раскинуть сумму между строками
    #39999807
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
declare @t table (row_id int,	id int, reserved_kg int,	kg int)
insert into @t values
(1,	570013,	1300,	1869),
(2,	570013,	385,	null),	
(3,	570013,	296,	null),	
(4,	570013,	119,	null),	
(1,	554444,	3300,	2869),
(2,	554444,	385,	null),	
(3,	554444,	296,	null),	
(4,	554444,	119,	null)	

--select * from @t

select
	*
	,case when max(kg)over(partition by id) - sum(reserved_kg)over(partition by id order by row_id) < 0 
		then 
		case when row_id=1
			then max(kg)over(partition by id) 
			else 
			case when max(kg)over(partition by id) - sum(reserved_kg)over(partition by id order by row_id) + reserved_kg > 0
				then max(kg)over(partition by id) + reserved_kg - sum(reserved_kg)over(partition by id order by row_id) 
				else null 
			end
		end
		else reserved_kg
	end as result
from @t


row_ididreserved_kgkgresult15544443300286928692554444385NULLNULL3554444296NULLNULL4554444119NULLNULL15700131300186913002570013385NULL3853570013296NULL1844570013119NULLNULL
...
Рейтинг: 0 / 0
Раскинуть сумму между строками
    #40001715
Sybex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот такой вариант по идее должен быть чуть лучше в плане производительности:
Код: 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.
declare @t table (row_id int,	id int, reserved_kg int,	kg int)
insert into @t values
(1,	570013,	1300,	1869),
(2,	570013,	385,	null),	
(3,	570013,	296,	null),	
(4,	570013,	119,	null),	
(1,	554444,	3300,	2869),
(2,	554444,	385,	null),	
(3,	554444,	296,	null),	
(4,	554444,	119,	null)	

;WITH [CTE]
AS
(
    SELECT row_id, id, reserved_kg, kg
          ,FIRST_VALUE(kg) OVER(PARTITION BY id ORDER BY row_id) - SUM(reserved_kg) OVER(PARTITION BY id ORDER BY row_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS remainder
      FROM @t
)
SELECT row_id, id, reserved_kg, kg
      ,CASE
           WHEN remainder < 0
           THEN CASE
                    WHEN remainder + reserved_kg < 0
                    THEN NULL
                    ELSE remainder + reserved_kg
                END
           ELSE reserved_kg
       END AS result
  FROM [CTE]



Конструкция
Код: sql
1.
SUM(reserved_kg) OVER(PARTITION BY id ORDER BY row_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

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


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