利用 Sqlserver CTE 进行树结构统计

总结一下这段时间做的统计功能点。
下面的例子是利用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



数据:

利用 Sqlserver CTE 进行树结构统计_第1张图片



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

 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 



结果:


利用 Sqlserver CTE 进行树结构统计_第2张图片









你可能感兴趣的:(sql,server,with,CTE)