Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка с деревом / 3 сообщений из 3, страница 1 из 1
18.04.2002, 08:09
    #32028162
Alexey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка с деревом
Помогите с решить задачку с деревом.
Есть такая таблица:
ID ParentID SumByID SumParent
1 NULL 111 0
2 1 2 0
3 1 32 0
4 NULL 0 0
5 4 27 0
6 5 5 0
7 6 0 0
Необходимо заполнить поле SumParent суммой
всех SumByID данной ветки. Например:
для ID=1 SumParent=111+2+32
для ID=2 SumParent=2
для ID=4 SumParent=0+27+5+0
для ID=6 SumParent=5+0
и т.д. Я посмотрел темы в форуме, но там в основном задачи на построение
дерева от корня и далее. А здесь скорее наоборот нужно.
...
Рейтинг: 0 / 0
18.04.2002, 09:05
    #32028176
AlexP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка с деревом
Я сделал так:

create table qqq (
ID int identity primary key,
ParentID int null foreign key references qqq,
SumByID int not null,
SumParent int not null
)

go

set identity_insert qqq on
insert into qqq (ID, ParentID, SumByID, SumParent) values (1, NULL, 111, 0)
insert into qqq (ID, ParentID, SumByID, SumParent) values (2, 1, 2, 0)
insert into qqq (ID, ParentID, SumByID, SumParent) values (3, 1, 32, 0)
insert into qqq (ID, ParentID, SumByID, SumParent) values (4, NULL, 0, 0)
insert into qqq (ID, ParentID, SumByID, SumParent) values (5, 4, 27, 0)
insert into qqq (ID, ParentID, SumByID, SumParent) values (6, 5, 5, 0)
insert into qqq (ID, ParentID, SumByID, SumParent) values (7, 6, 0, 0)
set identity_insert qqq off

go

create function sum_qqq_parent (@qqq_id int) returns int as
begin
declare @result int
select @result = SumById from qqq where id = @qqq_id
select @result = @result + IsNull(sum(dbo.sum_qqq_parent(id)), 0) from qqq where ParentId = @qqq_id
return @result
end

go

update qqq set SumParent = dbo.sum_qqq_parent(id)

Недостаток в том, что каждый узел считается вглубь столько раз, сколько в нем уровней, потому что в функции нельзя делать update.
Можно попробовать сделать процедуру, но в ней, видимо, придется использовать курсор.
...
Рейтинг: 0 / 0
18.04.2002, 13:35
    #32028221
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка с деревом
Код "сырой" и не очень проверенный, но идею думаю поймешь

-- Отбираю во временную таблицу все записи у которых нет ни одного ПОТОМКА
-- т.е. ни одна запись не ссылается на них как на родителя

SELECT * INTO #TabTmp FROM TabTree
WHERE ID NOT IN (SELECT ParentID FROM TabTree)

-- Организую цикл пока есть хотя бы одна запись в таблице #TabTmp
-- Наверно можно поставить условие @@RowCount>0 - не проверял
WHILE EXISTS (SELECT * FROM #TabTmp)
BEGIN

-- Запись очередных сумм
UPDATE TabTree
SET a.SumParent=a.SumParent+b.SumByID
FROM TabTree a, #TabTmp b
WHERE a.ID=b.ID

-- Теперь необходимо пересоздать таблицу #TabTmp так, чтобы в ней оказались те записи
-- прямые потомки которых сейчас находятся в #TabTmp

SELECT * INTO #TabTmp2 FROM TabTree
WHERE ID IN (SELECT ParentID FROM #TabTmp WHERE NOT ParentID IS NULL)

DROP TABLE #TabTmp
SELECT * INTO #TabTmp FROM #TabTmp2
DROP TABLE #TabTmp2

END
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка с деревом / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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