每個地區遞歸層級可能不一致,數據表(table)存放最小層級地區 area --地區層級表 id name f_id leve 1 中國 0 1 2 湖北 1 2 3 武漢 2 3 ...
--測試數據 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
結果:
--語句設計的很好,參考一下
轉:http://zhidao.baidu.com/link?url=Wevi5LnFNIn66I60bjk7_x8yaTfD2-acH37Zhgmp_5drupcAQ30DciqpG6Ypo7xPaSHInqfItrAMUx1srOuvpT8XjMXvYlzXEV6X8bvbUnW