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

Откуда: родина Ленина!
Сообщений: 2040
DECLARE @temp TABLE (id int,parent int,[count] int, [level] int);

insert into @temp (id,parent ,[count] ,[level] ) 
(	select 0,0,0,0
	union all select 1,0,1,1 union  all select 2,0,1,1  
	union all select 3,1,1,2 union all select 4,1,1,2 union all select 5,2,1,2
	union all select 6,3,1,3 union all select 7,4,1,3 union all select 8,4,1,3
	)
	
select * from @temp
declare @max int
set @max = (select top(1) [level] from @temp order by [Level] Desc)
 while (@max >0)
 begin
     UPDATE @temp
		SET [count] = [count] + (select COALESCE(Sum([count]),0) from @temp as tt  where tt.parent =id)
		where id in (Select id from @temp where level =@max)
     Set @max = @max -1
 end
 select * from @temp

Есть иерархическая таблица, пример с данными привел.
Id parent count level
0 0 0 0
1 0 1 1
2 0 1 1
3 1 1 2
4 1 1 2
5 2 1 2
6 3 1 3
7 4 1 3
8 4 1 3

надо подняться с ниженго урвоян на верх и сложить текущий count с суммной полей count дочерних элементов стоящий на уровень ниже. Скрипт сверху по обновению не работает, я выбираю все элементы текущего уровня, обновляю и подымаюсь на уровень. Подскажите как поправить.
Результат примерно должен быть

Id parent count level
0 0 5 0
1 0 1 1
2 0 4 1
3 1 2 2
4 1 3 2
5 2 1 2
6 3 1 3
7 4 1 3
8 4 1 3
10 сен 12, 23:56    [13143152]     Ответить | Цитировать Сообщить модератору
 Re: запрос для иерархической таблицы  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
handmadeFromRu
Результат примерно должен быть

не понял принципа...почему, например у id = 1 остался count = 1, а у id = 2 count = 4?!
11 сен 12, 08:49    [13143552]     Ответить | Цитировать Сообщить модератору
 Re: запрос для иерархической таблицы  [new]
handmadeFromRu
Member

Откуда: родина Ленина!
Сообщений: 2040
ошибся в расчетах) ночь ..глаза уже закрывались...пересчитал
Id parent count level
0 0 8 0
1 0 6 1
2 0 2 1
3 1 2 2
4 1 3 2
5 2 1 2
6 3 1 3
7 4 1 3
8 4 1 3

дерево по сути такое,собственный count узла 1, в скабках указан после сумы сосбветно с подуровнем
level 0 0(8)
|_________
| |
level 1 1(6) 2(2)
|____ |
| | |
level 2 3(2) 4(3) 5(1)
| |_____
| | |
level 3 6(1) 7(1) 8(1)
11 сен 12, 09:08    [13143586]     Ответить | Цитировать Сообщить модератору
 Re: запрос для иерархической таблицы  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
DECLARE @temp TABLE (id int,parent int,[count] int, [level] int);

insert into @temp (id,parent ,[count] ,[level] ) 
(	select 0,0,0,0
	union all select 1,0,1,1 union  all select 2,0,1,1  
	union all select 3,1,1,2 union all select 4,1,1,2 union all select 5,2,1,2
	union all select 6,3,1,3 union all select 7,4,1,3 union all select 8,4,1,3
	);

with cte
as
(
select id i, * from @temp 
union all
select t2.i, t1.* 
  from @temp t1 
    inner join cte t2 
      on t1.parent = t2.id
  where t1.level > 0
)
select t1.id, t1.parent, t2.cnt, t1.level
from @temp t1
cross apply ( select sum(count) cnt from cte where i = t1.id ) t2


так?!
11 сен 12, 09:13    [13143606]     Ответить | Цитировать Сообщить модератору
 Re: запрос для иерархической таблицы  [new]
handmadeFromRu
Member

Откуда: родина Ленина!
Сообщений: 2040
Knyazev Alexey , да спасибо, но мне надо физическую таблицу проапдейтить..я в примере изза этого указал операцию update, можете в этом плане помоч?
11 сен 12, 09:33    [13143677]     Ответить | Цитировать Сообщить модератору
 Re: запрос для иерархической таблицы  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
handmadeFromRu
Knyazev Alexey , да спасибо, но мне надо физическую таблицу проапдейтить..я в примере изза этого указал операцию update, можете в этом плане помоч?


эээ...а в чём проблема исправить селект на апдейт? что-то у вас совсем пробелы в знаниях:

DECLARE @temp TABLE (id int,parent int,[count] int, [level] int);

insert into @temp (id,parent ,[count] ,[level] ) 
(	select 0,0,0,0
	union all select 1,0,1,1 union  all select 2,0,1,1  
	union all select 3,1,1,2 union all select 4,1,1,2 union all select 5,2,1,2
	union all select 6,3,1,3 union all select 7,4,1,3 union all select 8,4,1,3
	);

with cte
as
(
select id i, * from @temp 
union all
select t2.i, t1.* 
  from @temp t1 
    inner join cte t2 
      on t1.parent = t2.id
  where t1.level > 0
)
update t1
set count = t2.cnt
from @temp t1
cross apply ( select sum(count) cnt from cte where i = t1.id ) t2

select * from @temp
11 сен 12, 09:40    [13143720]     Ответить | Цитировать Сообщить модератору
 Re: запрос для иерархической таблицы  [new]
handmadeFromRu
Member

Откуда: родина Ленина!
Сообщений: 2040
Knyazev Alexey
handmadeFromRu
Knyazev Alexey , да спасибо, но мне надо физическую таблицу проапдейтить..я в примере изза этого указал операцию update, можете в этом плане помоч?

эээ...а в чём проблема исправить селект на апдейт? что-то у вас совсем пробелы в знаниях:

блин точно ..туплю. сори..перегорел видать. огромное спасибо. видели бы предыщуй запрос) и время выволнения его))
11 сен 12, 09:44    [13143754]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить