-3

Özyinelemeli sorgu kullanmak istiyorum (cte veya bir şey olabilir) burada yönetici raporunu çekmeye çalışıyorum - bir çalışanın adını girdiğim ve ilgili tüm hiyerarşiyi istiyorum çalışanların en üst düzey çalışanlarla başlaması (CEO ile başlayarak) ve daha sonra aşağı inmesi. ÖrneğinT-SQL- Yinelemeli sorgu çalışanı hiyerarşisi

: Tüm Çalışanlar Celia (giriş parametresi) dahil MgrZ rapor

CEO 
Employees reporting to CEO , let's say MgrX 
Employees reporting to MgrX- let's say MgrY 
Employees reporting to MgrY - let's say MgrZ 

:

gibi girdi çalışan adı Celia, rapor bakmak gerekir.

ben kullanmaya çalışıyorum sorgusu:

  with cte1 as 
      (

      select 
      pa.PERSNBR 
      ,pa.AUTHCD 
      ,pu.VALUE 
      ,hr.File# 
      ,hr.[Payroll Name] 
      ,hr.[Reports To File#] 
      ,hr.[Reports To Name] 
      ,hr.[EMC#] 
      ,hr.[EMC Name] 

      from 
        [DNA_Staging].[dbo].[PERSAUTH] pa 
      join [DNA_Staging].[dbo].[PERSEMPL] pe 
       on pa.PERSNBR = pe.PERSNBR 
      join [DNA_Staging].[dbo].[PERSUSERFIELD] pu 
       on pe.PERSNBR = pu.PERSNBR 
       and pu.USERFIELDCD = 'EFNR' 
       and GETDATE() < isnull(pe.inactivedate,getdate()+1) 
       join [HR_Staging].[dbo].[HR_EmployeeHierarchyStaging] hr 
       on pu.VALUE = substring(hr.File#,2,6) 
       or pu.VALUE = substring(hr.File#,3,6) 

       ), 

       -- find all the data for input payroll name in the parameter 
       cte2 as (select * 
       FROM cte1 where [Payroll Name] = 'Acain, Celia T'), 
+2

okuyunuz [bu] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a -public-forum /) sorunuzun iyileştirilmesiyle ilgili bazı ipuçları için. İpucu: Bir soru içermelidir. – HABO

cevap

0

Temel bir örnek Sorunuza (eğer herhangi bir veri örneklerini veya çıkış örnekler sağlamak değil, bu yüzden ...):

DECLARE @name nvarchar(20) = 'Darkwater' 

;WITH emplevels AS (
SELECT * 
FROM (VALUES 
(1, 'CEO'), 
(2, 'MgrX'), 
(3, 'MgrY'), 
(4, 'MgrZ') 
) as t(eid, who) 
), 
people AS (--people and there levels 
SELECT * 
FROM (VALUES 
(1, 'Smith', 1), 
(2, 'Wake', 2), 
(3, 'Cartman', 3), 
(4, 'Sanders', 4), 
(5, 'MacCormic', 1), 
(6, 'Malkovich', 2), 
(7, 'Whatever', 2), 
(8, 'Darkwater', 3), 
(9, 'Leto', 4) 
) as t(pid, name, eid) 
), 
dep AS (--dependences of levels 
SELECT * 
FROM (VALUES 
(1,1), --CEO - CEO 
(1,2), --CEO - MgrX 
(2,3), --MgrX - MgrY 
(3,4) --MgrY - MgrZ 
)as t(eid1,eid2) 
), 
hier as (-- get the hierarchy 
SELECT d.eid1, 
     d.eid2 
FROM dep d 
LEFT JOIN people p ON d.eid2 = p.eid 
where name = @name 
UNION ALL 
SELECT d.eid1, 
     d.eid2 
FROM dep d 
INNER JOIN hier h ON d.eid2 = h.eid1 
WHERE d.eid2 != d.eid1 
) 
--here comes heads and who there are 
SELECT p.name AS Head, 
     e.who AS WhoIs 
from hier h 
LEFT JOIN people p ON p.eid = h.eid1 
LEFT JOIN emplevels e ON e.eid = p.eid 
ORDER BY e.eid 

Darkwater için sonuç (o, MgrY). Hepimiz MgrX ve CEO 's var:

Head  WhoIs 
--------- ----- 
Smith  CEO 
MacCormic CEO 
Wake  MgrX 
Malkovich MgrX 
Whatever MgrX 

(5 row(s) affected)