declare @TB_Category table (id int,ParentID int,name varchar(20))insert @TB_Category values(1,0,'Level1')
insert @TB_Category values(2,   1 ,      'Level2A')
insert @TB_Category values(3,   1  ,     'Level2B')
insert @TB_Category values(4,   2   ,    'Level3A')
insert @TB_Category values(5,   3    ,   'Level3B')
insert @TB_Category values(6,3      , 'Level3C')
declare @TB_Fee table (ID int,CategoryID int,Fee int)
insert @tb_fee values(1,   1       , 1)
insert @tb_fee values(2,   5       , 2)
insert @tb_fee values(3,   3       , 2)
insert @tb_fee values(4,   6       , 3)
insert @tb_fee values(5,   3       , 5)
insert @tb_fee values(6,   4  , 6)
insert @tb_fee values(7,   5       , 3)
insert @tb_fee values(8,   4       , 4)
insert @tb_fee values(9,   5       , 2)
insert @tb_fee values(10,   6       , 4)
insert @tb_fee values(11,   3       , 1)
insert @tb_fee values(12,   4       , 6)
insert @tb_fee values(13,   4       , 3)
insert @tb_fee values(14,   2       , 4)
insert @tb_fee values(15,   1       , 5)
insert @tb_fee values(16,   6       , 5)
insert @tb_fee values(17,   6       , 9)
declare @参数 varchar(100)
set @参数='Level1'declare @t table(id int,idm varchar(8000),level int)
declare @level int
set @level=1
insert @t select id,cast(id as varchar),@level from @TB_Category where name=@参数
while @@rowcount>0
begin
  set @level=@level+1
  insert @t select a.id,b.idm+','+cast(a.id as varchar),@level from @TB_Category a join @t b on a.ParentID=b.ID
where b.level=@level-1
endselect bb.*,[sum]=(select sum(CategoryID) from @tb_fee a join @t b on a.id=b.id where b.idm like aa.idm+'%')
from @t aa join @TB_Category bb on aa.id=bb.id
order by level/*id          ParentID    name                 sum         
----------- ----------- -------------------- ----------- 
1           0           Level1               22
2           1           Level2A              11
3           1           Level2B              10
4           2           Level3A              6
5           3           Level3B              3
6           3           Level3C              4(所影响的行数为 6 行)
*/

解决方案 »

  1.   

    --来晚了:declare @参数 varchar(100)
    set @参数='Level1'create proc 过程名 
    @参数 varchar(100)
    asdeclare @tmp1 table (id int,ParentID int,name varchar(20),层次 varchar(1000))
    insert @tmp1 select *,cast(id as varchar(10))+',' from TB_Category where name=@参数
    while @@rowcount>0
      insert @tmp1 select a.*,b.层次+cast(a.id as varchar(10))+',' from  TB_Category a,@tmp1 b where a.ParentID=b.ID and a.ID not in (select ID from @tmp1)select a.id,a.name,(select sum(CategoryID) from TB_Fee where fee in (select id from @tmp1 where 层次 like a.层次+'%')) 结果 from @tmp1 a
    go--调用
    exec 过程名 'Level1'
      

  2.   

    两位高人,还有个问题啊第2层的和应该等于第一层的求和
    也就是说第一行=第二行+第三行
    为什么现在不相等?
    id          ParentID    name                 sum         
    ----------- ----------- -------------------- ----------- 
    1           0           Level1               22
    2           1           Level2A              11
    3           1           Level2B              1022和11+10 ?
      

  3.   

    应为
    0自己也在你的TB_Fee 表里也有呀11+10+ 10<<==它自己的10
      

  4.   

    11+10+ 1<<==它自己的1
      

  5.   

    --如果不包含自身,只统计下级,就将查询语句改为:
    select bb.*,[sum]=(select sum(CategoryID) from @tb_fee a join @t b on a.id=b.id where b.idm like aa.idm+',%')  --这里,原来来: +'%'
    from @t aa join @TB_Category bb on aa.id=bb.id
    order by level
    /*--统计的结果,因为不包含自身,所以最末级无数据:
    id          ParentID    name                 sum         
    ----------- ----------- -------------------- ----------- 
    1           0           Level1               21
    2           1           Level2A              6
    3           1           Level2B              7
    4           2           Level3A              NULL
    5           3           Level3B              NULL
    6           3           Level3C              NULL(所影响的行数为 6 行)
    --*/