利用 Sqlserver CTE 进行树结构统计

本文介绍如何使用 SQL Server 的通用表表达式 (CTE) 实现树形结构的数据统计。通过递归查询从叶子节点开始,向上逐级汇总节点值,最终形成完整的树形统计结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结一下这段时间做的统计功能点。
下面的例子是利用sqlserver CTE 自下到上做树形结构的统计。
统计出每个节点的值都是下级节点的总和。


树形结构存储表:


CREATE TABLE [00_APP].[test_node](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[nodename] [varchar](50) NULL, --节点名称
[parentid] [bigint] NULL, -- 上级节点ID
[nodetype] [bigint] NULL,-- 节点类型:1 节点,2 叶子
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO



数据:

[img]http://dl2.iteye.com/upload/attachment/0103/5725/131e1b38-263f-38a1-83c7-f6195ab4810a.jpg[/img]



/******* 生成统计表 *******/

WITH suborgs
AS (
SELECT [00_APP].test_node.id ,
[00_APP].test_node.nodename ,
[00_APP].test_node.parentid ,
[00_APP].test_node.nodetype,

-- 增加统计列
[00_APP].test_node.nodename AS val

FROM [00_APP].test_node WITH ( NOLOCK )
WHERE nodetype = 2 -- 叶子节点

UNION ALL

SELECT node.id ,
node.nodename ,
node.parentid ,
node.nodetype ,

-- 增加的统计列
suborgs.val

FROM suborgs
INNER JOIN [00_APP].test_node AS node ON suborgs.parentid = node.id AND node.nodetype= 1 -- 非叶子节点
)

-- 可根据 group 条件对 “统计列” 进行统计
SELECT * FROM suborgs AS tres



结果:


[img]http://dl2.iteye.com/upload/attachment/0103/5727/21c58832-ce05-326c-81c1-c8d23e3b732e.jpg[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值