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

Откуда:
Сообщений: 72
добрый ден,

имеется таблица которое в форме выводится как дерево

an_id-integer
ID-integer
parent-integer
name-varchar
amount-float

ang_id, ID, parent, name, amount
322 34 0 a1 0
323 35 34 a2 10
324 36 34 a3 0
325 37 34 a4 5
326 38 36 a5 20
327 39 36 a6 30
328 40 0 b1 0
329 41 40 b2 40
331 42 40 b3 50

a1
|
|--a2
|
|--a3
| |
| |-a5
| |-a6
|
|-a4

b1
|
|-b2
|-b3


как будет выглядит запрос если надо получит сумму по ветвям
а3=а5+а6 записать а3
а1=а4+а2+а3 записать а1

b1=b2+b3 записать b1

Help my
1 июн 09, 17:25    [7252729]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
select @@version
?
1 июн 09, 17:26    [7252735]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
ambako
Member

Откуда:
Сообщений: 72
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
1 июн 09, 17:31    [7252759]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
-- test data
declare @t table(id int, parent int, name varchar(10), amount int)
insert into @t(id, parent, name, amount)
select 34,  0, 'a1',  0 union all
select 35, 34, 'a2', 10 union all
select 36, 34, 'a3',  0 union all
select 37, 34, 'a4',  5 union all
select 38, 36, 'a5', 20 union all
select 39, 36, 'a6', 30 union all
select 40,  0, 'b1',  0 union all
select 41, 40, 'b2', 40 union all
select 42, 40, 'b3', 50
-- end of test data

;with cte as (
   select id, parent, amount
     from @t as t
    where not exists (select *
                        from @t as i
                       where i.parent = t.id)
   union all
   select t.id, t.parent, c.amount
     from @t  as t
     join cte as c on c.parent = t.id
)
select t.id, t.parent, t.name, s.amount
  from @t as t
  join (select id, sum(amount) as amount
          from cte
         group by id) as s on s.id = t.id


id          parent      name       amount
----------- ----------- ---------- -----------
34          0           a1         65
35          34          a2         10
36          34          a3         50
37          34          a4         5
38          36          a5         20
39          36          a6         30
40          0           b1         90
41          40          b2         40
42          40          b3         50

(9 row(s) affected)
PS оптимально, наверное, не одним запросом, а в цикле многими update
но автор просил именно одним запросом
1 июн 09, 17:41    [7252825]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
ambako
Member

Откуда:
Сообщений: 72
дело мастера боится,
огромное спасибо,
не будет ли тормозит запрос при увеличении таблици? при 3000 записи
1 июн 09, 17:47    [7252865]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
ambako
не будет ли тормозит запрос при увеличении таблици? при 3000 записи
без понятия, замерьте уж сами
вроде объем не катастрофический
и вобще важно еще насколько оно (дерево) вложено
1 июн 09, 17:50    [7252887]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
ambako
Member

Откуда:
Сообщений: 72
и как я догадываюсь тщательно пока не смотрел для этого запроса степен в ложении не имеет разницу да?
1 июн 09, 17:50    [7252889]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
ambako
для этого запроса степен в ложении не имеет разницу да?
1) важно для затратности ресурсов
(как Вы смогли, наверное, заметить, там записи "размоножаются" перед суммированием)
2) и естественно про option maxrecursion забывать нельзя
1 июн 09, 17:53    [7252907]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
ambako
Member

Откуда:
Сообщений: 72
огромное спасибо
1 июн 09, 17:54    [7252917]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
ambako
Member

Откуда:
Сообщений: 72
В сем Добрый день

Пришлось опять побеспокоить вас

после этого запроса память увеличивается катастрофический
в taskmanager->sqlserver->mem usage доходить до 200МБ дальше не смотрел наверно будет увеличивается при других запросах он колеблится от 40 до 50

вы писали про ресурсы, ест ли вариант оптимизировать запрос
или надо рыть в сторону настройки sql server 2005
5 июн 09, 11:01    [7268670]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли такое  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
про настройки сервера не скажу потому что не знаю

просто озвучу вариант с циклом о котором я говорил ранее
-- test data
declare @t table(id int, parent int, name varchar(10), amount int)
insert into @t(id, parent, name, amount)
select 34,  0, 'a1', null union all
select 35, 34, 'a2',   10 union all
select 36, 34, 'a3', null union all
select 37, 34, 'a4',    5 union all
select 38, 36, 'a5',   20 union all
select 39, 36, 'a6',   30 union all
select 40,  0, 'b1', null union all
select 41, 40, 'b2',   40 union all
select 42, 40, 'b3',   50
-- end of test data

declare @id int
set @id = (select top 1 id 
             from @t t1
            where amount is null
              and not exists (select * from @t t2 where t2.parent = t1.id and t2.amount is null))

while @id is not null
begin
   update @t 
      set amount = (select sum(amount) from @t where parent = @id) 
    where id = @id

   set @id = (select top 1 id 
                from @t t1
               where amount is null
                 and not exists (select * from @t t2 where t2.parent = t1.id and t2.amount is null))
end

select * from @t

id          parent      name       amount
----------- ----------- ---------- -----------
34          0           a1         65
35          34          a2         10
36          34          a3         50
37          34          a4         5
38          36          a5         20
39          36          a6         30
40          0           b1         90
41          40          b2         40
42          40          b3         50

(9 row(s) affected)
является ли он оптимальным для Вашей задачи
и какие индексы ему нужны - оставляю решать и замерять Вам
5 июн 09, 11:14    [7268757]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить