那天由于本人贴的数据不全,网友M1CR0S0FT的计算只到下 一级次,如果多级不能计算
现在贴个全面的数据。。名称 接点ID 父ID 接点数据
fName fitemID fParentID Qua
A 13 0 0
B 14 0 75
C 15 0 0
D 16 0 0
E 17 0 0
F 18 0 0
G 19 0 1
H 20 0 0
I 21 0 0
J 22 0 0
K 23 0 0
B1 35 14 137
B2 53 14 0
B3 54 14 8
B4 55 14 9
B11 56 35 78
B12 58 35 39
B13 59 35 47
B14 60 35 223
B5 61 14 0
B41 62 55 2
F1 63 18 5需要选择结果 (说明,名字没有规则,按接点父子关系计算)
fName fitemID fParentID Qua
A 13 0 0
B 14 0 75+137+0+8+9+78+39+47+223+2
C 15 0 0
D 16 0 0
E 17 0 0
F 18 0 0+5
G 19 0 1
H 20 0 0
I 21 0 0
J 22 0 0
K 23 0 0

解决方案 »

  1.   

    declare @tb Table (fName varchar(10), fitemID int, fParentID int, Qua int)
    INSERT INTO @tb 
    SELECT 'A', 13, 0, 0 UNION ALL
    SELECT 'B', 14,0, 75 UNION ALL
    SELECT 'C', 15, 0, 0 UNION ALL
    SELECT 'D',16, 0, 0 UNION ALL
    SELECT 'E', 17, 0, 0 UNION ALL
    SELECT 'F', 18, 0, 0 UNION ALL
    SELECT 'G', 19, 0, 1 UNION ALL
    SELECT 'H', 20, 0, 0 UNION ALL
    SELECT 'I', 21, 0, 0 UNION ALL
    SELECT 'J', 22, 0, 0 UNION ALL
    SELECT 'K', 23, 0, 0 UNION ALL
    SELECT 'B1', 35, 14, 137 UNION ALL
    SELECT 'B2', 53, 14, 0 UNION ALL
    SELECT 'B3', 54, 14, 8 UNION ALL
    SELECT 'B4', 55, 14, 9 UNION ALL
    SELECT 'B11', 56, 35, 78 UNION ALL
    SELECT 'B12',58, 35, 39 UNION ALL
    SELECT 'B13', 59, 35, 47 UNION ALL
    SELECT 'B14', 60, 35, 223 UNION ALL
    SELECT 'B5', 61,14, 0 UNION ALL
    SELECT 'B41', 62, 55 ,2 UNION ALL
    SELECT 'F1', 63, 18, 5
    ;
    WITH CTE
    AS
    (
    SELECT *,fName as GrpName  FROM @tb WHERE fParentID=0  
    UNION ALL
    SELECT a.fName,a.fitemID,a.fParentID,b.Qua+a.Qua,b.GrpName
    FROM @tb a INNER JOIN CTE b ON a.fParentID=b.fItemID
    )
    SELECT a.fName,a.fItemID,a.fParentID,b.Result as Qua
    FROM @tb a INNER JOIN 
    (
    SELECT GrpName,MAX(Qua) as Result FROM CTE GROUP BY GrpName
    ) b
    ON a.fName=b.GrpName
      

  2.   


    结果不对啊,结果应该是:
    fName fitemID fParentID Qua 
    A 13 0 0 
    B 14 0 75+137+0+8+9+78+39+47+223+2 =618
    C 15 0 0 
    D 16 0 0 
    E 17 0 0 
    F 18 0 0+5 =5
    G 19 0 1 =1
    H 20 0 0 
    I 21 0 0 
    J 22 0 0 
    K 23 0 0 
      

  3.   

    WITH CTE
    AS
    (
        SELECT *,fName as GrpName  FROM @tb WHERE fParentID=0  
        UNION ALL
        SELECT a.fName,a.fitemID,a.fParentID,a.Qua,b.GrpName
        FROM @tb a INNER JOIN CTE b ON a.fParentID=b.fItemID)SELECT a.fName,a.fItemID,a.fParentID,b.Result as Qua
    FROM @tb a INNER JOIN 
        (
            SELECT GrpName,SUM(Qua) as Result FROM CTE GROUP BY GrpName
        ) b
        ON a.fName=b.GrpName