来自另一个 table 的聚合值的树结构递归总和

Tree structure recursive sum of aggregated values from another table

我正在尝试使用 CTE 进行递归求和,但我需要的值必须从另一个 table.

child 的总和加到 parent 的值上,我的问题是在递归部分不允许分组和聚合。这种情况可能还有另一种方法。

我的数据:

主要 table (tEvent)

Id                   ParentId             Name
-------------------------------------------------------
1                                         Main Project
2                    1                      Sub Project
3                    2                        Task 1.1
4                    2                        Task 1.2
5                    1                      Task 2
6                    1                      Task 3

额外 table (tBooking)

Id                   EventId              Value
------------------------------------------------
1                    1                    4
2                    2                    5
3                    2                    10
4                    3                    8
5                    4                    5
6                    4                    15
7                    5                    18
8                    6                    40
9                    6                    12
10                   6                    9

预期结果

Id                   Name                 SummedUp
---------------------------------------------------
1                    Main Project         126
2                      Sub Project        43
3                        Task 1.1         8
4                        Task 1.2         20
5                      Task 2             18
6                      Task 3             61

架构设置:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE [TABLE_NAME] = 'tEvent')
BEGIN
    DROP TABLE [tEvent]
END

CREATE TABLE [dbo].[tEvent]  
(
    [Id] NVARCHAR (50) NOT NULL, 
    [Name] NVARCHAR (50) NOT NULL,
    [ParentId] NVARCHAR (50) NOT NULL
);
    
INSERT INTO tEvent(Id, ParentId, Name) VALUES ('1','','Main Project');
INSERT INTO tEvent(Id, ParentId, Name) VALUES ('2','1','Sub Project');
INSERT INTO tEvent(Id, ParentId, Name) VALUES ('3','2','Task 1.1');
INSERT INTO tEvent(Id, ParentId, Name) VALUES ('4','2','Task 1.2');
INSERT INTO tEvent(Id, ParentId, Name) VALUES ('5','1','Task 2');
INSERT INTO tEvent(Id, ParentId, Name) VALUES ('6','1','Task 3');

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE [TABLE_NAME] = 'tBooking')
BEGIN
    DROP TABLE [tBooking]
END

CREATE TABLE [dbo].[tBooking] 
(
    [Id] NVARCHAR (50) NOT NULL, 
    [EventId] NVARCHAR (50) NOT NULL,
    [Value] [FLOAT]
);

INSERT INTO tBooking(Id, EventId, Value) VALUES ('1','1','4');
INSERT INTO tBooking(Id, EventId, Value) VALUES ('2','2','5');
INSERT INTO tBooking(Id, EventId, Value) VALUES ('3','2','10');
INSERT INTO tBooking(Id, EventId, Value) VALUES ('4','3','8');
INSERT INTO tBooking(Id, EventId, Value) VALUES ('5','4','5');
INSERT INTO tBooking(Id, EventId, Value) VALUES ('6','4','15');
INSERT INTO tBooking(Id, EventId, Value) VALUES ('7','5','18');
INSERT INTO tBooking(Id, EventId, Value) VALUES ('8','6','40');
INSERT INTO tBooking(Id, EventId, Value) VALUES ('9','6','12');
INSERT INTO tBooking(Id, EventId, Value) VALUES ('10','6','9'); 

我的查询:

;WITH CTE AS 
(
    SELECT 
        A.Id,
        SUM(B.Value) Value,
        A.Id Root
    FROM tEvent A
        LEFT JOIN tBooking B
            ON A.Id = B.EventId
    GROUP BY A.Id

    UNION ALL

    SELECT 
        A.Id,
        B.Value,
        CTE.Id
    FROM tEvent A
        INNER JOIN CTE
            ON A.ParentId = CTE.Id
        INNER JOIN tBooking B
            ON A.Id =  B.EventId
)
SELECT * FROM CTE;

这里是 sqlfiddle.

非常感谢任何帮助。

你可以总结如下。 因此,在您的 Fiddle 中,我发现 name 和 parentid 列可能已被颠倒。以下查询基于您的 fiddle。 link 也给你的 modified fiddle

; with bookingtotal as 
(
select 
       Eventid,
       value = sum(value) 
from tBooking 
group by EventId
), 
recursiontree as 
(
select  
    ParentId=id,
    eventid=id 
from  tEvent  
  union all
select  
    id=case when T.ParentId<>'' then T.ParentId else t.id end, 
    eventId=e.eventid 
from recursiontree e 
    join tEvent t on e.ParentId=t.Id
    where T.ParentId<>''
)
, eventTotal as 
(select ParentId, sum(value) as value
 from recursiontree e
  join bookingtotal b on e.eventId=b.Eventid
  group by ParentId
 )

select e.*,value from eventTotal t join tEvent e
on e.id=t.ParentId