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

作者:sword-successful

出处:https://www.cnblogs.com/sword-successful/p/16559559.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   歪头儿在北京  阅读(668)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示