SQL Server利用遞歸把全部【子部門員工】彙總到【一級根節點部門】

前言

      提及這個需求,有點反常規,左邊是組織機構樹,右邊是組織機構對應的員工列表。點擊左側組織機構時傳一個組織機構ID,而後查詢該組織機構以及其所屬的一級節點,若是有部門直屬單擊節點組織機構,則掛出來員工總數,也就是說根節點不須要向下遞歸,只須要查詢出對應的員工記錄便可,相反,因此的一級節點則須要向下遞歸計算出全部的員工總數。剛開始只知道遞歸,沒有具體的思路,後一個同事幫忙寫了一個,後發現思路確實巧妙,因此本身拿出來再分析分享下。node

 

思路分析

     一、單擊根節點不須要向下遞歸,那麼則把單擊根節點單獨拿出來。sql

     二、一級節點須要向下遞歸查詢出其所屬節點,那麼首先根據ParentID查詢出你傳入的組織機構ID所屬的一級節點組織機構(CTE遞歸),同時生成一個id(StartId)用來標識該組織機構隸屬的組織機構,向上統計時會用到spa

     三、把單獨拿出來的根節點和一級子節點及其所屬節點用UNION ALL拼接起來,準備統計時使用。blog

     四、統計總數時GROUP BY 使用StartId來分組。遞歸

 

代碼片斷

with t as(
   select * from dbo.orgInfo where pid=1 
),

p as(
  select a.id,a.node,a.pid,a.id as StartId 
  from dbo.orgInfo A where id in (select t.id from t)
  union all
  select K.id,K.node,K.pid,c.StartId as StartId
  from dbo.orgInfo K 
  inner join p C on k.pid=C.id
  
),
q as(
  select a.id,a.node,a.pid,A.id as StartId 
  from dbo.orgInfo A where id=1
  union 
  select * from p
)

--select * from q 

select q.id,q.node,m.Total from q
inner join (
select q.StartId,COUNT(1) as Total
from q
inner join dbo.userInfo a on a.OrgID=q.id
group by q.StartId
)m on q.id=m.StartId
相關文章
相關標籤/搜索