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


前言

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

 

思路分析

     1、單擊根節點不需要向下遞歸,那么則把單擊根節點單獨拿出來。

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

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

     4、統計總數時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

 


免責聲明!

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



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