gpt4 book ai didi

sql-server - 树结构中的递归求和

转载 作者:行者123 更新时间:2023-12-03 07:34:32 26 4
gpt4 key购买 nike

我在一张 table 上有一个树结构。该表是可以无限嵌套的类别树。每个类别都有一个 ProductCount 列,用于说明该类别中直接包含的产品数量(不汇总子类别)。

Id  | ParentId | Name      | ProductCount
------------------------------------
1 | -1 | Cars | 0
2 | -1 | Bikes | 1
3 | 1 | Ford | 10
4 | 3 | Mustang | 7
5 | 3 | Focus | 4

我想做一个 sql 查询,为每一行/类别提供产品数量,包括子类别中的产品数量。

上表的输出应该是
Id  | ParentId | Name      | ProductCount | ProductCountIncludingChildren
--------------------------------------------------------------------------
1 | -1 | Cars | 0 | 21
2 | -1 | Bikes | 1 | 1
3 | 1 | Ford | 10 | 21
4 | 3 | Mustang | 7 | 7
5 | 3 | Focus | 4 | 4

我知道我可能应该使用 CTE,但不能完全按照它应该的方式工作。

任何帮助表示赞赏!

最佳答案

您可以使用递归 CTE,在 anchor 部分获取所有行,在递归部分连接获取子行。记原版Id别名 RootID从 anchor 部分开始,并在按 RootID 分组的主查询中进行总和聚合.

SQL Fiddle

MS SQL Server 2012 架构设置 :

create table T
(
Id int primary key,
ParentId int,
Name varchar(10),
ProductCount int
);

insert into T values
(1, -1, 'Cars', 0),
(2, -1, 'Bikes', 1),
(3, 1, 'Ford', 10),
(4, 3, 'Mustang', 7),
(5, 3, 'Focus', 4);

create index IX_T_ParentID on T(ParentID) include(ProductCount, Id);

查询 1 :
with C as
(
select T.Id,
T.ProductCount,
T.Id as RootID
from T
union all
select T.Id,
T.ProductCount,
C.RootID
from T
inner join C
on T.ParentId = C.Id
)
select T.Id,
T.ParentId,
T.Name,
T.ProductCount,
S.ProductCountIncludingChildren
from T
inner join (
select RootID,
sum(ProductCount) as ProductCountIncludingChildren
from C
group by RootID
) as S
on T.Id = S.RootID
order by T.Id
option (maxrecursion 0)

Results :
| ID | PARENTID |    NAME | PRODUCTCOUNT | PRODUCTCOUNTINCLUDINGCHILDREN |
|----|----------|---------|--------------|-------------------------------|
| 1 | -1 | Cars | 0 | 21 |
| 2 | -1 | Bikes | 1 | 1 |
| 3 | 1 | Ford | 10 | 21 |
| 4 | 3 | Mustang | 7 | 7 |
| 5 | 3 | Focus | 4 | 4 |

关于sql-server - 树结构中的递归求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24394601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com