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
参考
博客地址: | http://www.cnblogs.com/sword-successful/ |
博客版权: | 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。 如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。 |