powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка с деревом
3 сообщений из 3, страница 1 из 1
Задачка с деревом
    #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
Задачка с деревом
    #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
Задачка с деревом
    #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
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка с деревом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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