sql server 递归汇总 按指定层级汇总
每个地区递归层级可能不一致,数据表(table)存放最小层级地区area--地区层级表idnamef_idleve1中国012湖北123武汉234云贵125云南436贵阳...
每个地区递归层级可能不一致,数据表(table)存放最小层级地区
area --地区层级表
id name f_id leve
1 中国 0 1
2 湖北 1 2
3 武汉 2 3
4 云贵 1 2
5 云南 4 3
6 贵阳 4 3
7 云南子区 5 4
8 贵阳子区 6 4
9 蔡甸 2 3
table --数据表
id area_id money
1 3 (武汉) 10
2 9(蔡甸) 5
3 7 (云南子区) 20
4 8 (贵阳子区) 30
按第二层级汇总,最后需要的结果
湖北 15
云贵 50 展开
area --地区层级表
id name f_id leve
1 中国 0 1
2 湖北 1 2
3 武汉 2 3
4 云贵 1 2
5 云南 4 3
6 贵阳 4 3
7 云南子区 5 4
8 贵阳子区 6 4
9 蔡甸 2 3
table --数据表
id area_id money
1 3 (武汉) 10
2 9(蔡甸) 5
3 7 (云南子区) 20
4 8 (贵阳子区) 30
按第二层级汇总,最后需要的结果
湖北 15
云贵 50 展开
1个回答
展开全部
--测试数据
with area(id,"name",f_id,leve) as (
select 1,'中国',0,1 union all
select 2,'湖北',1,2 union all
select 3,'武汉',2,3 union all
select 4,'云贵',1,2 union all
select 5,'云南',4,3 union all
select 6,'贵阳',4,3 union all
select 7,'云南子区',5,4 union all
select 8,'贵阳子区',6,4 union all
select 9,'蔡甸',2,3
), "table"(id,area_id,"money") as (
select 1,3,10 union all
select 2,9,5 union all
select 3,7,20 union all
select 4,8,30
)
--使用cte递归求出每个节点的路径
,t(id,f_id,"name","level",fullpath) as (
select a.id,a.f_id,a."name",a.leve,cast(a.id as varchar(max))
from area a
where a.leve=1
union all
select b.id,b.f_id,b."name",b.leve,t.fullpath+'->'+cast(b.id as varchar(max))
from area b
inner join t on t.id=b.f_id
)
--汇总统计每个节点的金额
select t.id,t."name",t."level",sum(c."money") as "money"
from t
inner join t t1 on charindex(t.fullpath,t1.fullpath)=1
inner join "table" c on c.area_id=t1.id
group by t.id,t."name",t."level"
having t."level"=2 --筛选出第二层级
order by t.id
结果:
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询