Sqlserver With用法

本文介绍使用SQL的递归公共表表达式(CTE)进行多级数据统计的方法,包括第一级数据统计和每个数据节点的统计,通过具体示例展示了如何在SQL Server中创建临时表、插入数据,并利用CTE进行数据聚合和层级计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用法1:第一级数据统计

use Tempdb

go

if not object_id(N'Tempdb..#T') is null

    drop table #T

Go

Create table #T([ID] int,[Name] nvarchar(22),[Score] int,[ParentID] int)

Insert #T

select 1,N'战一',101,0 union all

select 2,N'战二',102,1 union all

select 3,N'战三',103,1 union all

select 4,N'战四',104,3 union all

select 6,N'战五',105,0 union all

select 7,N'战五',105,6

GO

;WITH CTET AS

(

Select *,ID2=ID,Name2=Name from #T WHERE ParentID=0

UNION ALL

SELECT a.*,b.ID2,b.Name2 FROM #T AS a INNER JOIN CTET AS b ON b.ID=a.ParentID

)

SELECT ID2,Name2,SUM(Score) AS Scroe,COUNT(*) AS con FROM CTET GROUP BY Name2,ID2

/* 

ID2    Name2    Scroe    con

1    战一    410    4

6    战五    210    2*/

用法二:统计每个数据

create table tbs(id varchar(3) , pid varchar(3) , name varchar(10));
insert into tbs values('001' , null , '广东省');
insert into tbs values('002' , '001' , '广州市'); 
insert into tbs values('003' , '001' , '深圳市') ;
insert into tbs values('004' , '002' , '天河区') ;
insert into tbs values('005' , '003' , '罗湖区');
insert into tbs values('006' , '003' , '福田区') ;
insert into tbs values('007' , '003' , '宝安区') ;
insert into tbs values('008' , '007' , '西乡镇') ;
insert into tbs values('009' , '007' , '龙华镇');
insert into tbs values('010' , '007' , '松岗镇');

select * from tbs

with t as (
    select id,id q from tbs union all
    select a.id,b.q from tbs a inner join t b on a.pid=b.id
)
select tbs.*,COUNT(1)-1 from t inner join tbs on t.q=tbs.id group by tbs.id,tbs.name,tbs.pid

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值