大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说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
博客地址: | http://www.cnblogs.com/sword-successful/ |
博客版权: | 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。 如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。 |
原文地址:https://www.cnblogs.com/sword-successful/archive/2022/08/07/16559559.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/4914.html