CTE计算层级关系
推广渠道表有ParentID字段,代表上下层级关系。现要统计每个推广员,推广了多少人?
--创建表结构,插入测试数据
USE DBA_Monitor
GO
CREATE TABLE [dbo].[TGYinfo](
[TGYID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
[ParentID] [int] NULL,
[CreateTime] [datetime] NULL,
CONSTRAINT [PK_tgyTbl] PRIMARY KEY CLUSTERED
(
[TGYID] 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
ALTER TABLE [dbo].[TGYinfo] ADD CONSTRAINT [DF_TGYinfo_CreateTime] DEFAULT (getdate()) FOR [CreateTime]
GO
SET IDENTITY_INSERT [dbo].[TGYinfo] ON
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (1, N'推广1', 0, CAST(0x0000A4D100182B20 AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (2, N'推广2', 0, CAST(0x0000A4D100182B21 AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (3, N'推广1_1', 1, CAST(0x0000A4D100185C2E AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (4, N'推广1_2', 1, CAST(0x0000A4D100185C2F AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (5, N'推广1_3', 1, CAST(0x0000A4D100185C3D AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (6, N'推广1_1_1', 3, CAST(0x0000A4D10021A746 AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (7, N'推广1_1_2', 3, CAST(0x0000A4D100A1132A AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (8, N'推广2_1', 2, CAST(0x0000A4D100A13AE0 AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (9, N'推广2_2', 2, CAST(0x0000A4D100A1428E AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (10, N'推广2_1_1', 8, CAST(0x0000A4D100A15D3C AS DateTime))
INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (11, N'推广2_1_2', 8, CAST(0x0000A4D100A161F9 AS DateTime))
SET IDENTITY_INSERT [dbo].[TGYinfo] OFF
原始数据如下图所示,需要统计每个节点有多少下层用户
网上很多针对单一节点返回所有下层关系的代码,参考修改运行结果能正常返回。试想如果能将每次的单一节点一并返回出来,问题就基本解决了。或者说用一个字段标识,某N行对应是节点N返回的结果
--单一节点返回所有下层关系的代码
;with cte as
(select TGYID,Name,ParentID from TGYinfo
WHERE TGYID=1--单一节点
union all
select a.TGYID,a.Name,a.ParentID
from TGYinfo a
inner join cte c
on c.TGYID=a.ParentID
)
select * from cte

增加OrderID字段,区分数据由哪个节点返回
--生成OrderID字段
;with cte as
(select TGYID,Name,ParentID,convert(bigint,1000+TGYID) as OrderID--每层用四位编码
from TGYinfo
union all
select a.TGYID,a.Name,a.ParentID,convert(bigint,c.OrderID*10000)+convert(bigint,a.TGYID) OrderID
from TGYinfo a
inner join cte c
on c.TGYID=a.ParentID
)
select * from cte
order by convert(varchar,OrderID)

根据OrderID统计各节点的下层用户数
--最终统计结果
;with cte as
(select TGYID,Name,ParentID,convert(bigint,1000+TGYID) as OrderID--每层用四位编码
from TGYinfo
union all
select a.TGYID,a.Name,a.ParentID,convert(bigint,c.OrderID*10000)+convert(bigint,a.TGYID) OrderID
from TGYinfo a
inner join cte c
on c.TGYID=a.ParentID
)
select b.*,a.TGCount from(
select left(OrderID,4)%1000 TGYID,count(*) TGCount from cte
group by left(OrderID,4)
) a
inner join TGYinfo b
on a.TGYID=b.TGYID
order by a.TGYID

上面这个语句适合表中记录数<10000,如果有多的话,对应代码中的数值要扩大
CTE计算层级关系的更多相关文章
- NGUI 层级关系控制
		NGUI元素的遮挡情况是不依赖空间关系,所以在NGUI上添加特效有时候特别蛋疼,特别是美术同学还要依赖空间关系来控制特效效果,那先看看看NGUI的层级是怎么处理的,不过下面的描述都是针对单个相机下的P ... 
- 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示
		树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ... 
- Unity NGUI和UGUI与模型、特效的层级关系
		目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ... 
- 【吐血分享】SQL Server With As 递归获取层级关系数据
		纯洁的一周又开始了,今天看到一则新闻,笑尿了,和袁友们一起娱乐下 最近两月在做基于Saas模式的人力资源管理产品,平常数据库设计我经常会遇到如下需求场景: 以前商城类网站在设计类型表的时候,设计成单表 ... 
- MFC窗口的父子关系和层级关系
		一直对窗口之间的关系有些混乱,遇到需要指定父窗口的函数时常常要考虑很久,究竟父窗口是哪个窗口,遂上网查资料,略有所悟,简记如下: 对话框中的所有控件(比如Button等)都是其子窗口. ... 
- vue层级关系的数据管理
		项目背景:为一些有层级关系的数据管理做一套后台管理系统,例如一个小区,里面是有许多楼,楼里有许多层,每一层有许多不同的房······,现在就是要实现对这些数据进行增删改查操作. 1.Tree(树形组件 ... 
- NGUI与特效的层级关系
		通过调整特效的 render queue 来解决特效与NGUI界面之间的层级关系问题,用以下脚本解决: using System.Collections.Generic; using UnityEng ... 
- php解析出带层级关系的mpp文件
		本来要使用DHX gantt插件自带的API做导入,可是做完后,又发现不稳定,不能访问了 可能是屏蔽掉了 所以又想起可以使用javaBridge,借用java的MPXJ php解析mpp的 上一篇介绍 ... 
- css - Position定位属性与层级关系
		今天同事发现一个有意思的问题,关于position的层级关系的,他要不说我也没注意过 测试后果然有趣,有待深入研究: <!DOCTYPE html> <html> <he ... 
随机推荐
- Spring-JDBC通用Dao
			JdbcBaseDao JdbcBaseDao接口,内容如下: package com.sun4j.core.jdbc.dao; import java.io.Serializable; import ... 
- 升级xcode6和ios8后,unity遇到的一些小问题
			升级最新的Xocde6后,如果不是最新版本的unity,虽然也可以也可以正常的build,但如果想通过unity连真机进行profile的话,就会在xocde中报错,这个的主要原因是unity的配置里 ... 
- jQuery Questions:Front-end Developer Interview Questions
			Explain "chaining". Chaining allows us to run multiple jQuery methods (on the same element ... 
- 深入了解php opcode缓存原理
			什么是opcode opcode(operate code)是计算机指令中的一部分,用于指定要执行的操作,指令的格式和规范由处理器的指定规范指定 opcode是一种php脚本编译后的中间语言,就像ja ... 
- php 通过exec 创建git分支失败
			今天给我们自己的发布系统增加一个新建分支的功能,操作比较简单,但是使用php执行shell命令的时候总是无法push分支到远程,但是登陆服务器执行却是可以的 新建分支命令如下 git fetch -- ... 
- 怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?
			分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.b ... 
- nrf51822裸机教程-RTC
			RTC0被协议栈使用了.所以在跑蓝牙程序的情况下.RTC0不能使用. RTC相关寄存器如下: EVTEN,EVTENSET,EVTENCLR. 这三个寄存器用来设置是否使能某个事件.(TICK,OVR ... 
- 报javax.servlet.ServletException: Servlet.init() for servlet springmvc threw exception异常 的解决方案
			后台错误信息如下: javax.servlet.ServletException: Servlet.init() for servlet springmvc threw exception org.a ... 
- Linux学习之CentOS(十)--虚拟机下的CentOS如何上网
			原地址:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/05/3001148.html 这篇随笔应该说跟CentOS的学习关系不是很大, ... 
- ASP.NET MVC4中用 BundleCollection使用问题手记
			ASP.NET MVC4中对JS和CSS的引用又做了一次变化,在MVC3中我们这样引用资源文件: <link href="@Url.Content("~/Content/Si ... 
