Собрать итоги

maximIZ
Дата: 17.01.2009 06:44:29
Здравствуйте. попробую описать проблему свою. есть две таблицы.
1. Подразделений. список подразделений предприятия, с бесконечным уровнем вложенности, т.е. сколько уровней вложенности будет не известно.
2. Таблица с данными. например по некоторому подразделению закуплено некоторое колличество товара.
Моя задача собрать свод итоговый. всего по организации я могу собрать. и по подразделениям тоже. а вот итоги по разным уровням уже проблема потому как их количество не известно. Подскажите пожалуйста в каком направлении рыть. Или может опытом поделитесь, кто как делал в таких ситуациях.
maximIZ
Дата: 17.01.2009 06:55:29
Сразу добавлю примерную структуру таблиц.
1. подразделения
tblPodr - состоит из полей ID, ParentID, Name
ParentID - указывается ID родителя
2. Данные
tblData - состоит из столбцов ID, PodrID, Kolvo
Knyazev Alexey
Дата: 17.01.2009 08:46:15
CTE вам в помощь, и скрипты таблиц с наполнением данных могли бы и сами сделать,
если хотели получить быструю помощь
maximIZ
Дата: 17.01.2009 10:01:05
прошу прощение. мне легче скинуть бэкап базы.
maximIZ
Дата: 17.01.2009 10:01:25
maximIZ
Дата: 17.01.2009 10:01:40
maximIZ
Дата: 17.01.2009 10:02:53
СТЕ что то я не осилил. никак не соображу как к моему примеру применить
Паганель
Дата: 17.01.2009 11:28:17
declare @podr table(id int, pid int, name varchar(30))
insert into @podr(id, pid, name)
select 151, 330, 'Приморская ГРЭС' union all
select 152, 151,             'ЦТП' union all
select 326, 330,              'РУ' union all
select 327, 326,             'ГКР' union all
select 328, 151,             'ПРП' union all
select 329, 327,      'Участок №1' union all
select 330,   0,           'ЛуТЭК' union all
select 331, 327,      'Участок №2'

declare @data table(id int, podr_id int, kolvo int)
insert into @data(id, podr_id, kolvo)
select 1, 152, 7 union all
select 2, 328, 1 union all
select 3, 329, 4 union all
select 4, 331, 5

;with cte as (
   select p.id, p.pid, d.kolvo
     from @podr as p
     join @data as d on d.podr_id = p.id
    where not exists (select 1 from @podr as p1 where p1.pid = p.id
                      ) -- на всякий случай, хотя должно хватить join
   union all
   select p.id, p.pid, c.kolvo
     from @podr as p
     join cte as c on c.pid = p.id
)
select p.*, c.kolvo
  from @podr as p
  join (select id, sum(kolvo) as kolvo
          from cte
         group by id
        ) as c on c.id = p.id
 
id          pid         name                           kolvo
----------- ----------- ------------------------------ -----------
151         330         Приморская ГРЭС                8
152         151         ЦТП                            7
326         330         РУ                             9
327         326         ГКР                            9
328         151         ПРП                            1
329         327         Участок №1                     4
330         0           ЛуТЭК                          17
331         327         Участок №2                     5

(8 row(s) affected)
maximIZ
Дата: 17.01.2009 12:15:23
спасибо огромное. буду разбираться с СТЕ. на своем примере легче