采用sql2005,对一个树结构的表,如何取各级节点相对下级节点的数值之和,即节点值汇总? 谢谢!

解决方案 »

  1.   

    --测试数据
    DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10),Price INT)
    INSERT @t SELECT '001',NULL ,'山东省',20
    UNION ALL SELECT '002','001','烟台市',30
    UNION ALL SELECT '004','002','招远市',40
    UNION ALL SELECT '003','001','青岛市',10
    UNION ALL SELECT '005',NULL ,'四会市',15
    UNION ALL SELECT '006','005','清远市',30
    UNION ALL SELECT '007','006','小分市',80;WITH Liang AS
    (
        SELECT
            ID,
            PID,
            Name,
            Price,
            TotalPrice=Price,
            Path=CAST(Name AS VARCHAR(MAX)),
            level=1
        FROM @t
        WHERE PID IS NULL
        UNION ALL
        SELECT
            A.ID,
            A.PID,
            A.Name,
            A.Price,
            B.TotalPrice+A.Price,
            CAST(B.Path+'.'+A.Name AS VARCHAR(MAX)),
            B.level+1
        FROM @t AS A
            JOIN Liang AS B
                ON A.PID=B.ID
    )
    SELECT 
        REPLICATE(' ',level)+'|--'+Name,
        TotalPrice
    FROM Liang
    ORDER BY Path
      

  2.   


    create table tb(id varchar(3) , pid varchar(3) , name varchar(10)) 
    insert into tb values('001' , null  , '广东省') 
    insert into tb values('002' , '001' , '广州市') 
    insert into tb values('003' , '001' , '深圳市') 
    insert into tb values('004' , '002' , '天河区') 
    insert into tb values('005' , '003' , '罗湖区') 
    insert into tb values('006' , '003' , '福田区') 
    insert into tb values('007' , '003' , '宝安区') 
    insert into tb values('008' , '007' , '西乡镇') 
    insert into tb values('009' , '007' , '龙华镇') 
    insert into tb values('010' , '007' , '松岗镇') 
    go --查询指定节点及其所有子节点的函数 
    create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int) 
    as 
    begin 
      declare @level int 
      set @level = 1 
      insert into @t_level select @id , @level 
      while @@ROWCOUNT > 0 
      begin 
        set @level = @level + 1 
        insert into @t_level select a.id , @level 
        from tb a , @t_Level b 
        where a.pid = b.id and b.level = @level - 1 
      end 
      return 
    end 
      

  3.   

    谢谢楼上指点,我想得到这样的结果,实例:
    ID    PID    NAME     VALUE     LEVEL
    0             x1                  1
    1      0      x2                  2
    2      1      x3       100        3
    3      1      x4       200        3
    希望递归得到
    ID    PID    NAME     VALUE               LEVEL
    0             x1       300(x1的下级节点之和)   1
    1      0      x2       300(x2的下级节点之和)   2
    2      1      x3       100                   3
    3      1      x4       200                   3