Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 запрос с суммами внутри группировки  [new]
linav
Guest
подскажите, пожалуйста, как сделать такой запрос:

исходные данные, и что я пыталась делать
create table #t (id int, stat bit, v1 dec(9, 2), v2 dec(9, 2))

insert into #t (id, stat, v1, v2)
	select 1, 1, 1.1, 1.2 union all
	select 2, 0, 2.1, 2.2 union all
	select 3, 0, 3.1, 3.2 union all
	select 4, 0, 4.1, 4.2 union all
	select 5, 1, 5.1, 5.2 union all
	select 6, 1, 6.1, 6.2 union all
	select 7, 0, 7.1, 7.2 union all
	select 8, 0, 8.1, 8.2 union all
	select 9, 1, 9.1, 9.2
	
select * from #t

select SUM(v1), SUM(v2) 
	from #t t 
	where 
		id >= id and 
		id < (select top 1 id from #t t1 where t1.id > t.id and t1.stat = 1 order by t1.id) 
	group by stat

drop table #t


желаемый результат:

idfrom idto sumv1 sumv2
1 4 10,40 10,80
5 5 5,10 5,20
6 8 21,30 21,60
9 9 9,10 9,20
у меня конечно неправильно сделано, а как правильно не могу понять.
нужно с сортировкой по полю id суммировать поля v1,v2 при условии, что от первого значения stat = 1, до последнего значения stat = 0, т.е. до следующего stat =1. ну я думаю по желаемому результату понятно, что я хочу
29 янв 14, 11:32    [15486969]     Ответить | Цитировать Сообщить модератору
 Re: запрос с суммами внутри группировки  [new]
Добрый Э - Эх
Guest
использовать накопительную сумму по полю stat , как идентификатор группы для разбиения строк на нужные подмножества...
29 янв 14, 11:43    [15487034]     Ответить | Цитировать Сообщить модератору
 Re: запрос с суммами внутри группировки  [new]
Добрый Э - Эх
Guest
ПРИМЕР РЕАЛИЗАЦИИ ДЛЯ ВЕРСИИ СЕРВЕРА 2012.

Если версия сервера не позволяет использовать sum() over(order by), то просто заменить сию конструкцию на любое другое вычисление накопительного итога (примеров получения накопительного итога на форуме - воз и маленькая тележка).
29 янв 14, 11:48    [15487066]     Ответить | Цитировать Сообщить модератору
 Re: запрос с суммами внутри группировки  [new]
Добрый Э - Эх
Guest
Вариант на допотопный версиях сервера: тынц
29 янв 14, 11:53    [15487103]     Ответить | Цитировать Сообщить модератору
 Re: запрос с суммами внутри группировки  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
create table #t (id int, stat bit, v1 dec(9, 2), v2 dec(9, 2))
insert into #t (id, stat, v1, v2)
	select 1, 1, 1.1, 1.2 union all
	select 2, 0, 2.1, 2.2 union all
	select 3, 0, 3.1, 3.2 union all
	select 4, 0, 4.1, 4.2 union all
	select 5, 1, 5.1, 5.2 union all
	select 6, 1, 6.1, 6.2 union all
	select 7, 0, 7.1, 7.2 union all
	select 8, 0, 8.1, 8.2 union all
	select 9, 1, 9.1, 9.2
	
;with cte (idfrom,	idto,	sumv1,	sumv2, step) as
(select ID,ID,v1,v2,1 as step
 from #t as t1 where t1.stat=1
union all
select  t1.idfrom, t2.ID, cast(t1.sumv1+t2.v1 as dec(9, 2)), cast(t1.sumv2+t2. v2 as dec(9, 2)),t1.step+1 as step
from cte as t1
join #t as t2 on t2.id = t1.idto+1 and t2.stat<>1
)select top 1 with ties idfrom,	idto,	sumv1,	sumv2 
from cte order by ROW_NUMBER()over(partition by idfrom order by step desc)

drop table #t
29 янв 14, 12:08    [15487198]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить