推广渠道表有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计算层级关系的更多相关文章

  1. NGUI 层级关系控制

    NGUI元素的遮挡情况是不依赖空间关系,所以在NGUI上添加特效有时候特别蛋疼,特别是美术同学还要依赖空间关系来控制特效效果,那先看看看NGUI的层级是怎么处理的,不过下面的描述都是针对单个相机下的P ...

  2. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  3. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

  4. 【吐血分享】SQL Server With As 递归获取层级关系数据

    纯洁的一周又开始了,今天看到一则新闻,笑尿了,和袁友们一起娱乐下 最近两月在做基于Saas模式的人力资源管理产品,平常数据库设计我经常会遇到如下需求场景: 以前商城类网站在设计类型表的时候,设计成单表 ...

  5. MFC窗口的父子关系和层级关系

    一直对窗口之间的关系有些混乱,遇到需要指定父窗口的函数时常常要考虑很久,究竟父窗口是哪个窗口,遂上网查资料,略有所悟,简记如下: 对话框中的所有控件(比如Button等)都是其子窗口.        ...

  6. vue层级关系的数据管理

    项目背景:为一些有层级关系的数据管理做一套后台管理系统,例如一个小区,里面是有许多楼,楼里有许多层,每一层有许多不同的房······,现在就是要实现对这些数据进行增删改查操作. 1.Tree(树形组件 ...

  7. NGUI与特效的层级关系

    通过调整特效的 render queue 来解决特效与NGUI界面之间的层级关系问题,用以下脚本解决: using System.Collections.Generic; using UnityEng ...

  8. php解析出带层级关系的mpp文件

    本来要使用DHX gantt插件自带的API做导入,可是做完后,又发现不稳定,不能访问了 可能是屏蔽掉了 所以又想起可以使用javaBridge,借用java的MPXJ php解析mpp的 上一篇介绍 ...

  9. css - Position定位属性与层级关系

    今天同事发现一个有意思的问题,关于position的层级关系的,他要不说我也没注意过 测试后果然有趣,有待深入研究: <!DOCTYPE html> <html> <he ...

随机推荐

  1. IE6 BUG 汇总

    1.IE6双倍边距bug 当页面内有多个连续浮动时,如本页的图标列表是采用左浮动,此时设置li的左侧margin值时,在最左侧呈现双倍情况.如外边距设置为10px, 而左侧则呈现出20px,解决它的方 ...

  2. discuz怎么根据连接知道调用的是什么模板页面

    其实不怎么难,基本都可以看出discuz是怎么样调用模板页面的 这个是论坛的帖子的列表页,看到url就可以看出是forum目录下的forumdisplay这个模板,forumdisplay.html这 ...

  3. 如何解包,编辑,重新打包boot images

    HOWTO: Unpack, Edit, and Repack Boot Images http://forum.xda-developers.com/showthread.php?t=443994 ...

  4. VFS

    VFS的作用:为文件系统提供通用的接口. 通用文件模型:common file model.特殊文件系统需要将它的物理结构转换成通用文件模型. common file model包括以下几个重要对象: ...

  5. visual 2008中error PRJ0003 : 生成 cmd.exe 时出错

    visual 2008中error PRJ0003 : 生成 cmd.exe 时出错”,   和vs2008 sp1没关系 解决方案:工具—>选项—>项目和解决方案—>VC++目录, ...

  6. ThinkPHP 3.2.2 视图模板中使用字符串截取函数

    在项目的 Common/function.php 文件里( 项目结构如图 ) 添加函数: /*字符串截断函数+省略号*/ function subtext($text, $length) { if(m ...

  7. JS Questions:Front-end Developer Interview Questions

    Explain event delegation Event delegation allows us to attach a single event listener, to a parent e ...

  8. 《Java程序设计》第2周学习总结

    20145317彭垚<Java程序设计>第2周学习总结 教材学习内容总结 类型 基本类型 整数(short.int.long) 字节(byte) 浮点数(float/double) 字符( ...

  9. 【转】Unity3D的输入(Input)——键盘和鼠标

    http://blog.csdn.net/lingyun_blog/article/details/41451565 Unity3D使用input类控制用户的输入,输入包括了用户键盘,鼠标,触摸,重力 ...

  10. 创建QT CREATOR对话框报错 linux QT Creator :-1: error: cannot find -lGL

    装完QT5.4 及 QT Creator3.3 后 创建第一个QT Widgets Application(相当于窗体) 应用程序 报如上错误. 执行 sudo apt-get install lib ...