SQL 服务器 CTE 层次结构查询聚合

SQL Server CTE Hierarchy query aggregation

我想计算这里所有患有 CTE 的儿童中 SUM 是 DDL/DML。 0 个值是我不知道的,要通过聚合计算

CREATE TABLE [dbo].[Product]
(
    [ID] [INT] IDENTITY(1,1) NOT NULL,
    [Hierarchy] [VARCHAR](100) NOT NULL,
    [ParentID] [INT] NULL,
    [SalesAmount] [INT] NULL
) ON [PRIMARY]
GO

SET IDENTITY_INSERT [dbo].[Product] ON 
GO

INSERT [dbo].[Product] ([ID], [Hierarchy], [ParentID], [SalesAmount]) 
VALUES (1, N'root', NULL, 0),
       (2, N'T1', 1, 0),
       (3, N'T2', 1, 0),
       (4, N'C1', 2, 0),
       (5, N'C2', 3, 0),
       (6, N'C3', 2, 0), 
       (7, N'P1', 4, 1000),
       (8, N'P2', 5, 2000),
       (9, N'P3', 6, 3000)

我尝试了下面的查询,它给了我以下输出,

WITH CT AS 
(
    SELECT 
        ID, Hierarchy, ParentID, 0 AS Level, 
        CAST ([Hierarchy] AS VARCHAR (MAX)) AS [Linkeage]
    FROM
        dbo.Product
    WHERE 
        ParentID IS NULL

    UNION ALL

    SELECT 
        pc.ID, pc.Hierarchy, pc.ParentID, p1.Level + 1, 
        p1.Linkeage + ' -> ' + CAST ([pc].[Hierarchy] AS VARCHAR (MAX))
    FROM 
        dbo.Product AS pc
    JOIN 
        CT AS p1 ON p1.ID = pc.ParentID
),
Aggr AS 
(
    SELECT
        TC.ParentID,
        SUM(T.SalesAmount) AS sum_TotalAmt
    FROM
        CT TC
    INNER JOIN
        Product AS T ON TC.ID = T.ID
    GROUP BY
        TC.ParentID
)
SELECT 
    ID, Hierarchy, T.ParentID, Level, Linkeage, A.sum_TotalAmt
FROM 
    CT AS T
LEFT JOIN
    Aggr AS A ON ISNULL(T.Id, T.ParentID) = A.ParentID

我还需要现有的输出 + 带下划线的行。

我自己用不同的方法弄明白了,我想按值获得多个组的聚合,

CREATE TABLE [dbo].[Product](
    [ProductID] [int] IDENTITY(1,1) NOT NULL,
    [ProductType] [varchar](100) NOT NULL,
    [ProductCategory] [varchar](100) NOT NULL,
    [ProductName] [varchar](100) NOT NULL,
    [SalesAmount] [decimal]
) ON [PRIMARY]

所以我可以简单地得到下面的输出

select [ProductType], [ProductCategory], SUM( [SalesAmount] ) as TotalSales
from Product
GROUP BY ROLLUP (ProductType,ProductCategory)