Loading

SQL Server 递归+向上统计

前几天有个需求需要基于分类数据向上统计总数,一开始第一个想法是通过程序来计算,后再思考能不能通过SQL脚本直接来计算

基础数据

Id ParentId Category Num
1 0 分类1 0
2 1 分类1-1 10
3 1 分类1-2 10
4 3 分类1-2-1 5

这是基础数据,那么希望通过sql脚本向上统计分类对应的数量.

期望结果

Id Category Num
1 分类1 25
2 分类1-1 10
3 分类1-2 10
4 分类1-2-1 5

思路

  • 用sql递归CTE给每一个层次设置统计路径
  • 通过统计路径内联, 统计个数并分组展示
WITH result (Id, ParentId, Category, Num)
AS
(
  SELECT 1, 0, '分类1', 0
  UNION ALL
  SELECT 2, 1, '分类1-1',10
  UNION ALL
  SELECT 3, 1, '分类1-2', 10
  UNION ALL
  SELECT 4, 3, '分类1-2-1', 5 
),

CTE(Id, ParentId, Category, Path, Num)
As
(
  SELECT A.Id, A.ParentId, A.Category, CAST(A.Id As VARCHAR(MAX))+'->',A.Num FROM result A WHERE A.ParentId = 0
  UNION ALL
  SELECT B.Id, B.ParentId, B.Category,C.Path+CAST(B.Id As VARCHAR(MAX)), B.Num FROM result B
  INNER JOIN CTE c on C.Id = B.ParentId
)

SELECT C.Id,
C.Category,
SUM(C1.Num) AS Num
FROM CTE AS C
--整个统计方法的核心就是这一句代码:CHARINDEX
INNER JOIN CTE AS C1 ON CHARINDEX(C.Path, C1.Path) = 1
GROUP BY C.ID,C.Category 

参考

https://www.cnblogs.com/axiadi/p/7715529.html

posted @ 2022-08-07 18:05  歪头儿在北京  阅读(646)  评论(0编辑  收藏  举报