Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
chron Member Откуда: Сообщений: 210 |
казалось бы, простая задача: нужно счесть суммы объектов в таблице @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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
|
||
29 авг 16, 10:55 [19601405] Ответить | Цитировать Сообщить модератору |
так например,
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] Ответить | Цитировать Сообщить модератору |
chron Member Откуда: Сообщений: 210 |
alexeyvg, да, нужно всегда суммировать "до разрыва". Но. Волшебный Guest решил задачу. Я бы до такого не додумался. Склоняю голову. |
29 авг 16, 14:34 [19602717] Ответить | Цитировать Сообщить модератору |
3unknown Member Откуда: New York Сообщений: 140 |
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 | ![]() |