0

私はテーブルを持っています

Node | NoteParent | Num
  A  |     Root   | 10      
  B  |     A      | 20
  C  |     A      | 30
  G  |     B      | 40
  D  |     B      | 50
  E  |     G      | 70
  F  |     C      | 60

CTE を使用してノードの数を合計する方法は、別のノードへのリンクに依存するという質問があります。たとえば、ノード B の Num が 20 で、ノード B はノード G とノード D の親であり、ノード G はノード E の親でもあるため、関連するノードのすべての num を使用します 20(B) + 40( G) + 50(D) + 70(E) = 180

結果は次のようになります。

Node | NoteParent |  Num  |  SUM 
  A  |    Root    |  10   |  280
  B  |     A      |  20   |  180   
  C  |     A      |  30   |   90 
  G  |     B      |  40   |  110
  D  |     B      |  50   |   50
  E  |     G      |  70   |   70
  F  |     C      |  60   |   60
4

1 に答える 1

5

のようなものはどうですか

DECLARE @MyTable TABLE
    ([Node] varchar(1), [NoteParent] varchar(4), [Num] int)
;

INSERT INTO @MyTable
    ([Node], [NoteParent], [Num])
VALUES
    ('A', 'Root', 10),
    ('B', 'A', 20),
    ('C', 'A', 30),
    ('G', 'B', 40),
    ('D', 'B', 50),
    ('E', 'G', 70),
    ('F', 'C', 60)


;WITH Vals AS (
        SELECT  mt.Node TopNode,
                mt.NoteParent TopNoteParent,
                *
        FROM    @MyTable mt
        UNION ALL
        SELECT  v.TopNode,
                v.TopNoteParent,
                m.*
        FROM    @MyTable m  INNER JOIN
                Vals v ON   v.Node = m.NoteParent
)
SELECT  TopNode,
        TopNoteParent,
        SUM(Num) [SUM]
FROM    Vals
GROUP BY    TopNode,
        TopNoteParent
ORDER BY 1

SQL フィドルのデモ

于 2013-08-06T04:51:28.633 に答える