推广渠道表有ParentID字段,代表上下层级关系。现要统计每个推广员,推广了多少人?

  1. --创建表结构,插入测试数据
  2. USE DBA_Monitor
  3. GO
  4. CREATE TABLE [dbo].[TGYinfo](
  5. [TGYID] [int] IDENTITY(1,1) NOT NULL,
  6. [Name] [varchar](50) NULL,
  7. [ParentID] [int] NULL,
  8. [CreateTime] [datetime] NULL,
  9. CONSTRAINT [PK_tgyTbl] PRIMARY KEY CLUSTERED
  10. (
  11. [TGYID] ASC
  12. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  13. ) ON [PRIMARY]
  14. GO
  15. ALTER TABLE [dbo].[TGYinfo] ADD CONSTRAINT [DF_TGYinfo_CreateTime] DEFAULT (getdate()) FOR [CreateTime]
  16. GO
  17. SET IDENTITY_INSERT [dbo].[TGYinfo] ON
  18. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (1, N'推广1', 0, CAST(0x0000A4D100182B20 AS DateTime))
  19. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (2, N'推广2', 0, CAST(0x0000A4D100182B21 AS DateTime))
  20. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (3, N'推广1_1', 1, CAST(0x0000A4D100185C2E AS DateTime))
  21. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (4, N'推广1_2', 1, CAST(0x0000A4D100185C2F AS DateTime))
  22. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (5, N'推广1_3', 1, CAST(0x0000A4D100185C3D AS DateTime))
  23. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (6, N'推广1_1_1', 3, CAST(0x0000A4D10021A746 AS DateTime))
  24. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (7, N'推广1_1_2', 3, CAST(0x0000A4D100A1132A AS DateTime))
  25. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (8, N'推广2_1', 2, CAST(0x0000A4D100A13AE0 AS DateTime))
  26. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (9, N'推广2_2', 2, CAST(0x0000A4D100A1428E AS DateTime))
  27. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (10, N'推广2_1_1', 8, CAST(0x0000A4D100A15D3C AS DateTime))
  28. INSERT [dbo].[TGYinfo] ([TGYID], [Name], [ParentID], [CreateTime]) VALUES (11, N'推广2_1_2', 8, CAST(0x0000A4D100A161F9 AS DateTime))
  29. SET IDENTITY_INSERT [dbo].[TGYinfo] OFF

原始数据如下图所示,需要统计每个节点有多少下层用户

网上很多针对单一节点返回所有下层关系的代码,参考修改运行结果能正常返回。试想如果能将每次的单一节点一并返回出来,问题就基本解决了。或者说用一个字段标识,某N行对应是节点N返回的结果

  1. --单一节点返回所有下层关系的代码
  2. ;with cte as
  3. (select TGYID,Name,ParentID from TGYinfo
  4. WHERE TGYID=1--单一节点
  5. union all
  6. select a.TGYID,a.Name,a.ParentID
  7. from TGYinfo a
  8. inner join cte c
  9. on c.TGYID=a.ParentID
  10. )
  11. select * from cte


增加OrderID字段,区分数据由哪个节点返回

  1. --生成OrderID字段
  2. ;with cte as
  3. (select TGYID,Name,ParentID,convert(bigint,1000+TGYID) as OrderID--每层用四位编码
  4. from TGYinfo
  5. union all
  6. select a.TGYID,a.Name,a.ParentID,convert(bigint,c.OrderID*10000)+convert(bigint,a.TGYID) OrderID
  7. from TGYinfo a
  8. inner join cte c
  9. on c.TGYID=a.ParentID
  10. )
  11. select * from cte
  12. order by convert(varchar,OrderID)


根据OrderID统计各节点的下层用户数

  1. --最终统计结果
  2. ;with cte as
  3. (select TGYID,Name,ParentID,convert(bigint,1000+TGYID) as OrderID--每层用四位编码
  4. from TGYinfo
  5. union all
  6. select a.TGYID,a.Name,a.ParentID,convert(bigint,c.OrderID*10000)+convert(bigint,a.TGYID) OrderID
  7. from TGYinfo a
  8. inner join cte c
  9. on c.TGYID=a.ParentID
  10. )
  11. select b.*,a.TGCount from(
  12. select left(OrderID,4)%1000 TGYID,count(*) TGCount from cte
  13. group by left(OrderID,4)
  14. ) a
  15. inner join TGYinfo b
  16. on a.TGYID=b.TGYID
  17. 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. dig理解DNS的解析过程 - 阿权的书房

    关于DNS的常识,可以阅读附录的一些参考资料.本文旨在尝试举例用dig命令理解这个过程,并非权威知识,仅供参考.测试域名为阿权的书房的域名 www.aslibra.com 和 www.163.com. ...

  2. Eclipse学习记录

    设置背景色:http://jingyan.baidu.com/article/2a138328b5d9ea074a134fc7.html 项目文件说明:http://www.cnblogs.com/p ...

  3. Intel OIT demo

    https://software.intel.com/en-us/blogs/2013/07/18/order-independent-transparency-approximation-with- ...

  4. Archlinux 简明安装指南

    archlinux是在distrowatch里位于top 10的发行版中,唯一采用roll release的distribution. pacman和yaourt双剑合壁,使得在archlinux安装 ...

  5. MVC问题

    将 <customErrors mode="Off" defaultRedirect="~/404.html">   mode 设置为off  就可 ...

  6. centos 6.X 安装scrapy-原创

    特别注意[坑]: python版本一定大于 2.7.5,scrapy python 必须2.7以上centos 6.X系列 系统默认安装的python是2.6.6 ,本人折腾了很久2.7.3 在这里升 ...

  7. 读书笔记——《图解TCP/IP》(3/4)

    经典摘抄 第五章 IP协议相关技术 1.DNS可以将网址自动转换为具体的IP地址. 2.主机识别码的识别方式:为每台计算机赋以唯一的主机名,在进行网络通信时,可以直接使用主机名称而无需输入一大长串的I ...

  8. Linq&Lumda---LINQ to DataSet的DataTable操作

    1. DataTable读取列表 DataSet ds = new DataSet();// 省略ds的Fill代码DataTable products = ds.Tables["Produ ...

  9. Wordpress制作sidebar.php

    调用 在主页以下方法可以调用模板中sidebar.php的内容 <?php get_sidebar(); ?> 判断是否自定义sidebar侧边栏: <?php if ( !func ...

  10. 1057 N的阶乘

    1057 N的阶乘 基准时间限制:1 秒 空间限制:131072 KB 输入N求N的阶乘的准确值. Input 输入N(1 <= N <= 10000) Output 输出N的阶乘 Inp ...