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

Откуда:
Сообщений: 252
казалось бы, простая задача:

нужно счесть суммы объектов в таблице @list
declare @list table (idOrder int, idObject int, cntObject int)

insert @list (idOrder, idObject, cntObject) values (1, 1, 1)
insert @list (idOrder, idObject, cntObject) values (2, 1, 1)
insert @list (idOrder, idObject, cntObject) values (3, 2, 1)
insert @list (idOrder, idObject, cntObject) values (4, 3, 2)
insert @list (idOrder, idObject, cntObject) values (5, 3, 1)
insert @list (idOrder, idObject, cntObject) values (6, 1, 1)

select * from @list


результат должен быть таким:
declare @listCompound table (idOrder int, idObject int, sumObject int)

insert @listCompound(idOrder, idObject, sumObject) values (1, 1, 2)
insert @listCompound(idOrder, idObject, sumObject) values (2, 2, 1)
insert @listCompound(idOrder, idObject, sumObject) values (3, 3, 3)
insert @listCompound(idOrder, idObject, sumObject) values (4, 1, 1)

select * from @listCompound

…………………
т.е. нужно суммировать @list.cntObject для записей, у которых в упорядоченном списке одно значение @list.idObject. При этом:
- значения @list.idOrder не совпадают со значениями нат. ряда. Т.е. значения @list.idOrder могут быть такими {2, 8, 23, 44, …}
- значения @listCompound.idOrder не связаны со значениями @list.idOrder. Важен только порядок.
29 авг 16, 10:40    [19601344]     Ответить | Цитировать Сообщить модератору
 Re: Не могу придумать sql-запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32178
chron
т.е. нужно суммировать @list.cntObject для записей, у которых в упорядоченном списке одно значение @list.idObject.
Одно значение "до разрыва"?
29 авг 16, 10:55    [19601405]     Ответить | Цитировать Сообщить модератору
 Re: Не могу придумать sql-запрос  [new]
так например,
Guest
;with cte as
	(select
		i		=row_number()over(order by idOrder)-row_number()over(partition by idObject order by idOrder)
		,*
	from @list)

select 
	idOrder			=row_number()over(order by min(idOrder))
	,idObject
	,sumObject		=sum(cntObject)
from cte
group by 
	i 
	,idObject
29 авг 16, 11:02    [19601433]     Ответить | Цитировать Сообщить модератору
 Re: Не могу придумать sql-запрос  [new]
chron
Member

Откуда:
Сообщений: 252
alexeyvg,
да, нужно всегда суммировать "до разрыва".

Но. Волшебный Guest решил задачу.
Я бы до такого не додумался. Склоняю голову.
29 авг 16, 14:34    [19602717]     Ответить | Цитировать Сообщить модератору
 Re: Не могу придумать sql-запрос  [new]
3unknown
Member

Откуда: New York
Сообщений: 141
select row_number() over( order by i,min(idorder))  as idOrder,idObject,sum(cntObject)
from(
select
		idOrder-row_number()over(partition by idObject order by idOrder) as i
		,*
	from @list
	) a
	group by i,idObject


select row_number() over( order by s)  as idOrder,
max(idObject) as idObject,sum(cntObject) as cntObject
from(
select*
,sum(d) over( order by idorder) s 
from(
select * 
,case when idObject = isnull(lag(idObject) over(order by idOrder),idObject) then 0 else 1 end d
from @list
) a
) b
group by s
29 авг 16, 17:32    [19603866]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить