来自另一个 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
我正在尝试使用 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