Рекурсивное суммирование с использованием иерархии с условиями

Ссылаясь на более раннее описание проблемы по адресу: Иерархическая сумма столбца SQL Server

Код ниже для реализации:

USE tempdb;
IF OBJECT_ID('dbo.Hierarchy') IS NOT NULL
    DROP TABLE dbo.[Hierarchy];

CREATE TABLE dbo.Hierarchy 
(
    ID INT NOT NULL PRIMARY KEY,
    ParentID INT NULL,
        CONSTRAINT [FK_parent] FOREIGN KEY ([ParentID]) REFERENCES dbo.Hierarchy([ID]),
    hid HIERARCHYID,
    Amount INT
);

INSERT INTO [dbo].[Hierarchy]
        ( [ID], [ParentID], [Amount] )
VALUES  
    (1, NULL, NULL ),
    (2, 1, NULL),
    (3, 1, 50),
    (4, 2, 58),
    (5, 2, 7),
    (6, 3, 10),
    (7, 3, 20)
; WITH cte AS (
    SELECT  [h].[ID] ,
            [h].[ParentID] ,
            CAST('/' + CAST(h.[ID] AS VARCHAR(10)) + '/' AS VARCHAR(MAX)) AS [h],
            [h].[hid]
    FROM    [dbo].[Hierarchy] AS [h]
    WHERE   [h].[ParentID] IS NULL

    UNION ALL

    SELECT  [h].[ID] ,
            [h].[ParentID] ,
            CAST([c].[h] + CAST(h.[ID] AS VARCHAR(10)) + '/' AS VARCHAR(MAX)) AS [h],
            [h].[hid]
    FROM    [dbo].[Hierarchy] AS [h]
    JOIN    [cte] AS [c]
            ON [h].[ParentID] = [c].[ID]
)
UPDATE [h]
SET hid = [cte].[h]
FROM cte
JOIN dbo.[Hierarchy] AS [h]
    ON [h].[ID] = [cte].[ID];

SELECT p.id, SUM([c].[Amount])
FROM dbo.[Hierarchy] AS [p]
JOIN [dbo].[Hierarchy] AS [c]
    ON c.[hid].IsDescendantOf(p.[hid]) = 1
GROUP BY [p].[ID];

Спасибо Ben Thul за приведенный выше код! Я немного изменил его, чтобы он соответствовал моей постановке задачи. Как видно, узлы с ID=1 и 2 не имеют никаких значений. То же самое в графическом представлении ниже. Мне еще не разрешено размещать встроенные изображения.

ссылка здесь или https://i.stack.imgur.com/RuBdu.png

Сценарий, который у меня есть, заключается в том, что, поскольку узел с идентификатором = 3 имеет значение, я хочу, чтобы его родитель получил суммарное значение узлов с идентификаторами 2 и 3. Что делает приведенный ниже код, так это то, что он также пузырит значения узлов внуков.

Текущий выход:

<style>
table, th, td {
  border: 1px solid black;
}
</style>
<table>
<tr>
<th>ID</th>
<th>Value</th>
</tr>
<tr>
<td>1</td>
<td>145</td>
</tr>
<tr>
<td>2</td>
<td>65</td>
</tr>
<tr>
<td>3</td>
<td>80</td>
</tr>
<tr>
<td>4</td>
<td>58</td>
</tr>
<tr>
<td>5</td>
<td>7</td>
</tr>
<tr>
<td>6</td>
<td>10</td>
</tr>
<tr>
<td>7</td>
<td>20</td>
</tr>
</table>

Ожидаемый результат:

<style>
table {
  border-collapse: collapse;  
}

td, th {
  border: 1px solid #dddddd;
  text-align: left;
  padding: 8px;
}
</style>
<table>
<tr>
<th>ID</th>
<th>Value</th>
</tr>
<tr>
<td>1</td>
<td style="background-color:#FF0000;">115</td>
</tr>
<tr>
<td>2</td>
<td>65</td>
</tr>
<tr>
<td>3</td>
<td style="background-color:#FF0000;">50</td>
</tr>
<tr>
<td>4</td>
<td>58</td>
</tr>
<tr>
<td>5</td>
<td>7</td>
</tr>
<tr>
<td>6</td>
<td>10</td>
</tr>
<tr>
<td>7</td>
<td>20</td>
</tr>
</table>

Я надеюсь, что это ясно, что мне нужно. Спасибо за помощь!


person Palthis    schedule 08.02.2019    source источник
comment
. . Сформулируйте свою проблему в автономной форме, включая примеры данных, желаемые результаты и описание. Вы можете обратиться к другим страницам, но ваш вопрос должен стоять сам по себе.   -  person Gordon Linoff    schedule 08.02.2019
comment
Соберите некоторые образцы данных с помощью rextester и свяжите их. Вы можете использовать этот несвязанный пример, чтобы вдохновиться и адаптировать что-то подходящее для вашего вопроса rextester.com/TXQB38528. сделано 'Вилка' это! И у вас будет новая ссылка. Вам также придется объяснить в вопросе, что вы ожидаете в качестве вывода.   -  person JGFMK    schedule 09.02.2019
comment
обновил OP с более подробной информацией   -  person Palthis    schedule 11.02.2019