sql server 遞歸匯總 按指定層級匯總


每個地區遞歸層級可能不一致,數據表(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM