Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Раскинуть сумму между строками / 4 сообщений из 4, страница 1 из 1
17.09.2020, 13:42
    #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
17.09.2020, 14:09
    #39999795
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскинуть сумму между строками
Focha,

sum() over() + case
...
Рейтинг: 0 / 0
17.09.2020, 14:18
    #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
23.09.2020, 15:12
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Раскинуть сумму между строками / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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