SQL Server 递归+向上统计
前几天有个需求需要基于分类数据向上统计总数,一开始第一个想法是通过程序来计算,后再思考能不能通过SQL脚本直接来计算
基础数据
| Id | ParentId | Category | Num |
|---|---|---|---|
| 1 | 0 | 分类1 | 0 |
| 2 | 1 | 分类1-1 | 10 |
| 3 | 1 | 分类1-2 | 10 |
| 4 | 3 | 分类1-2-1 | 5 |
这是基础数据,那么希望通过sql脚本向上统计分类对应的数量.
期望结果
| Id | Category | Num |
|---|---|---|
| 1 | 分类1 | 25 |
| 2 | 分类1-1 | 10 |
| 3 | 分类1-2 | 10 |
| 4 | 分类1-2-1 | 5 |
思路
- 用sql递归CTE给每一个层次设置统计路径
- 通过统计路径内联, 统计个数并分组展示
WITH result (Id, ParentId, Category, Num)
AS
(
SELECT 1, 0, '分类1', 0
UNION ALL
SELECT 2, 1, '分类1-1',10
UNION ALL
SELECT 3, 1, '分类1-2', 10
UNION ALL
SELECT 4, 3, '分类1-2-1', 5
),
CTE(Id, ParentId, Category, Path, Num)
As
(
SELECT A.Id, A.ParentId, A.Category, CAST(A.Id As VARCHAR(MAX))+'->',A.Num FROM result A WHERE A.ParentId = 0
UNION ALL
SELECT B.Id, B.ParentId, B.Category,C.Path+CAST(B.Id As VARCHAR(MAX)), B.Num FROM result B
INNER JOIN CTE c on C.Id = B.ParentId
)
SELECT C.Id,
C.Category,
SUM(C1.Num) AS Num
FROM CTE AS C
--整个统计方法的核心就是这一句代码:CHARINDEX
INNER JOIN CTE AS C1 ON CHARINDEX(C.Path, C1.Path) = 1
GROUP BY C.ID,C.Category
参考
https://www.cnblogs.com/axiadi/p/7715529.html
SQL Server 递归+向上统计的更多相关文章
- SQL Server里等待统计(Wait Statistics)介绍
在今天的文章里我想详细谈下SQL Server里的统计等待(Wait Statistics),还有她们如何帮助你立即为什么你的SQL Server当前很慢.一提到性能调优,对我来说统计等待是SQL S ...
- SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因
很多时候,我们经常使用sp_spaceused来查看表的空间使用情况,上个月群里有个网友说他使用DELETE删除了数据后,使用sp_spaceused查看,发现该表的分配的空间总量(reserved) ...
- SQL Server 递归
SQL Server 没有类似于Oracle START WITH NAME='xx' CONNECT BY PRIOR ID=PARENT_ID这样的语句,但是可以通过自定义标准函数+With语句实 ...
- sqlserver cte递归向上统计
数据字典如下
- sql server 递归汇总 按指定层级汇总
每个地区递归层级可能不一致,数据表(table)存放最小层级地区 area --地区层级表 id name f_id leve 1 中国 0 1 2 湖北 1 2 3 武汉 2 3 ... --测试数 ...
- SQL Server 2008 R2——统计各部门某年入职人数
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- sql server递归日期
在做项目任务时,需要将一个日期范围转换为日期表. 例如:日期范围(2017年01月21日~2017年02月20日).转换成一日为单位的日期表,如下. 2017-01-21 2017-01-22 201 ...
- SQL Server研究之统计信息—发现过期统计信息并处理具体解释
前言: 统计信息是关于谓词中的数据分布的主要信息源,假设不知道详细的数据分布,优化器不能获得预估的数据集.从而不能统计须要返回的数据. 在创建列的统计信息后,在DML操作如insert.upda ...
- sql server递归
with cte as ( select belongsAgent from [QPProxyDB].[dbo].[BS_ProxyInfo] where ProxyID = @ProxyID uni ...
- SQL server 存储过程实现统计赋值
@EmptyCount int output 参数 declare @strCount nvarchar(max); 声明变量 取值语句: set @strCount='select @Count= ...
随机推荐
- RocketMQ 全链路灰度探索与实践
本文作者:肖京,Spring Cloud Alibaba PMC,阿里云智能技术专家. 01 全链路灰度背景介绍 发布新版本时,为了有效.谨慎地验证新版本代码逻辑的正确性,通常会采用灰度发布,从而达到 ...
- cmd杀死占用端口号的Java进程
下面列出两种杀死进程的方法: 1.根据jps查询.2.根据端口号查询进程. 最后根据进程id杀死进程(注意:进程id不等同于端口号) 根据jps查进程 jps命令,列出Java进程列表 根据进程id杀 ...
- Centos7安装Mysql5.7.42
安装前的清理 查看是否安装了Mysql版本 [root@localhost ~]# yum list installed mysql* [root@localhost ~]# rpm –qa|grep ...
- Go语言学习 _基础03 _数组和切片
Go语言学习 _基础03 _数组和切片 1.数组 package array_test import "testing" func TestArrayInit(t *testing ...
- duxapp放弃了redux,在duxapp中局部、全局状态的实现方案
全局状态 全局状态是一个很实用的功能,例如管理用户信息,组件间状态共享等功能都需要用到全局状态,react有很多成熟的全局状态管理工具,但是很多写起来太过麻烦,duxapp提供了几种应对不同场景的全局 ...
- ARC151C 01 Game
ARC151C 01 Game 题目链接:ARC151C 01 Game \(SG\) 函数好题. 思路 考虑把原问题分成多个区间的不同问题,求 \(SG\) 在异或起来. 设: 1.\(SG_1(l ...
- php 安装使用 seaslog扩展
这是一个高性能的日志记录扩展,能迅速帮你格式化的写入日志文件. 首先来看安装: sudo pecl install seaslog 一句话搞定,然后更新php.ini配置文件 添加启用以及一部分配置 ...
- java中的集合包简要分析
1.集合包 集合包是java中最常用的包,它主要包括Collection和Map两类接口的实现. 对于Collection的实现类需要重点掌握以下几点: 1)Collection用什么数据结构实现? ...
- Python:编程“八荣八耻”之我见
刚在逛CPyUG时看到了个主题讨论python的八荣八耻,见:http://bit.ly/4jeBor, 主题内容如下: 以动手实践为荣,以只看不练为耻. 以打印日志为荣,以单步跟踪为耻. 以空白 ...
- nginx之常见错误
在此只介绍源码安装nginx的时候,发生的一些常见的错误 1. nginx访问出现File not found 1) php-fpm找不到SCRIPT_FILENAME中执行的PHP文件 更改配置文件 ...