0

組織の監督関係階層を示すレポートを作成する必要があります。監視ラインを設定するには、さまざまな方法があります。以下はその一部です。

Vice President-Associate VP-Director-Assistant Director-Supervisor-worker
Vice President-Associate VP-Director-Supervisor - worker
Vice President-Director-Assistant Director-Supervisor-worker
Vice President-Director-worker
Vice President-Director-Director B-Worker
Vice President-Director-Director B-Supervisor->Worker
Vice President-Associate VP-worker
Vice President-worker
Vice President-Director-Assistant Director
Vice President-Director-worker

これらは、階層内の各役割の表です。つまり、VP テーブルAVP テーブルディレクター テーブルなどです。階層ラインに特定のロールが含まれていない場合、その値は null に戻ります。プログラムを作成したので、Worker テーブルから始めて、そこからすべてのテーブルを結合します。可能なすべての結合を考慮に入れようとしました (以下のプログラムを参照)。Supervisor_Position_NBR=POSITION_NBRを使用してさまざまな結合の組み合わせを使用しています。行が次のように見えるさまざまな方法があります。ここでは小さな例を示します。

副社長 Associate_VP Director Director B Assistant_Director Supervisor Worker ============== ============ ======== ======= === ================= ========== ====== ジェーン スミス ジョー ロバーツ マーシー ジェームズ ヌル ヌル ジェームズ メア マット G
ジェーンスミス ジョー ロバーツ マーシー ジェームス ヌル ジェームズ マーレ ジェス D ジェーン スミス ジョー ロバーツ マーシー ジェームス ヌル フランク ジェイ キャロル R ジェーン スミス ヌル マーティ ボブ ヌル ソニア ヌル サム スミス ジェーン スミス ヌル マーティ ボブ ヌル ソニア ヌル ネイト ロウ ジェーン スミス ヌル ヌル ヌル ヌル ヌル ヌルラルフ・コール

私の2つの問題は次のとおりです。

  1. VP 、Director および Worker を含む監督ラインがあるが、Director と Worker の両方が VP に直接レポートする場合、クエリを実行すると Director がドロップオフし、Worker だけが表示されます。したがって、この:

副社長 アソシエイト_VP ディレクター ディレクター B アシスタント ディレクター スーパーバイザー ワーカー
============== =========== ======= ======== == ================ ========= ======= ジェーン・スミス Null Null Null Null Null MarcyJames

これを元に戻す必要がある場合:

副社長 アソシエイト_VP ディレクター ディレクター B アシスタント ディレクター スーパーバイザー ワーカー
============= =========== ======== ======== == ======== ======= ========= ===== ジェーン・スミス Null Null Null Null Null Marcy James
Jane Smith Null Joe Roberts Null Null Null Null

  1. このクエリを作成するためのよりクリーンで効率的な方法はありますか?

どんな援助も大歓迎です。

select
    vp.Vice_President,
    avp.Associate_VP,  
    d.director, 
    db.director_B,
    ad.Assistant_Director,
    s.Supervisor,
    w.worker
    from gw_ppp.dbo.vw_worker w 
    left join gw_ppp.dbo.vw_Manager_Sup_Role s 
    on w.Supervisor_Position_NBR=s.POSITION_NBR
    left join gw_ppp.dbo.vw_ADIR_Role AD 
    on w.Supervisor_Position_NBR=AD.POSITION_NBR
    or s.Supervisor_Position_NBR=AD.POSITION_NBR
    left join gw_ppp.dbo.vw_Dir_Role_B db 
    on w.Supervisor_Position_NBR=db.POSITION_NBR
    or s.Supervisor_Position_NBR=db.POSITION_NBR
    or AD.Supervisor_Position_NBR=db.POSITION_NBR
    left join gw_ppp.dbo.vw_Dir_Role D 
    on w.Supervisor_Position_NBR=D.POSITION_NBR
    or s.Supervisor_Position_NBR=D.POSITION_NBR
    or AD.Supervisor_Position_NBR=D.POSITION_NBR
    or db.Supervisor_Position_NBR=D.POSITION_NBR
    left join gw_ppp.dbo.vw_AVP_Role AVP 
    on w.Supervisor_Position_NBR=AVP.POSITION_NBR
    or s.Supervisor_Position_NBR=AVP.POSITION_NBR
    or AD.Supervisor_Position_NBR=AVP.POSITION_NBR
    or D.Supervisor_Position_NBR=AVP.POSITION_NBR
    left join  gw_ppp.dbo.vw_VP_Role VP 
    on w.Supervisor_Position_NBR=VP.POSITION_NBR
    or s.Supervisor_Position_NBR=vp.POSITION_NBR
    or ad.Supervisor_Position_NBR=vp.POSITION_NBR
    or d.Supervisor_Position_NBR=vp.POSITION_NBR
    or avp.Supervisor_Position_NBR=vp.POSITION_NBR
    order by w.worker

Role ビューの作成に使用するプログラムは次のとおりです。

CREATE VIEW [vw_VP_Role]
AS

SELECT 
File_NBR, 
job_title, 
(First_Name + ' ' + Last_Name) as Vice_President, 
POSITION_NBR ,
Supervisor_Position_NBR, 
(Mngr_FName + ' ' + Mngr_LName ) as vp_Manager 
FROM [New_EEs].[dbo].[ADPFile]
where Job_title in 
('Vice President','Sr VP & Chief Financial Officer','Sr. Vice President');



CREATE VIEW [vw_AVP_Role]
AS
SELECT 
File_NBR, 
job_title, 
(First_Name + ' ' + Last_Name) as Associate_VP, 
POSITION_NBR,
Supervisor_Position_NBR, 
(Mngr_FName + ' ' + Mngr_LName ) as Avp_Manager 
FROM [New_EEs].[dbo].[ADPFile]
where Job_title in 
('Associate Vice President','Senior Performance Officer');

CREATE VIEW [vw_Dir_Role]
AS
SELECT 
File_NBR, 
job_title, 
(First_Name + ' ' + Last_Name) as Director, 
POSITION_NBR,
Supervisor_Position_NBR, 
(Mngr_FName + ' ' + Mngr_LName ) as Dir_Manager 
FROM [New_EEs].[dbo].[ADPFile]
where Job_title in
('Director','Chief Information Officer','Deputy Controller','Director of Operations & Staff Dev')
and not (First_Name + ' ' + Last_Name) in ('Michelle James','Edward Lachterman', 'Nafissa Hannat')

CREATE VIEW [vw_Dir_Role_B]
AS
SELECT 
File_NBR, 
job_title, 
(First_Name + ' ' + Last_Name) as Director_B, 
POSITION_NBR,
Supervisor_Position_NBR, 
(Mngr_FName + ' ' + Mngr_LName ) as Dir_Manager 
FROM [New_EEs].[dbo].[vw_ADPFile]
where (First_Name + ' ' + Last_Name) in ('Michelle James','Edward Lachterman', 'Nafissa Hannat')

CREATE VIEW [vw_ADIR_Role]
AS
SELECT 
File_NBR, 
job_title, 
(First_Name + ' ' + Last_Name) as Assistant_Director, 
POSITION_NBR,
Supervisor_Position_NBR, 
(Mngr_FName + ' ' + Mngr_LName ) as AD_Manager 
FROM [New_EEs].[dbo].[ADPFile]
where Job_title= 'Assistant Director'

CREATE VIEW [vw_Manager_Sup_Role]
AS 
SELECT 
File_NBR, 
job_title, 
(First_Name + ' ' + Last_Name) as Supervisor, 
POSITION_NBR,
Supervisor_Position_NBR, 
(Mngr_FName + ' ' + Mngr_LName ) as Sup_Manager 
FROM [New_EEs].[dbo].[vw_ADPFile]
where Job_title in ('Supervisor','Campus Administration Manager','Compensation & Benefits Manager',
'Cottage Manager', 'Manager','Office Manager','Operations Manager','Recruiting Manager','Special Projects/Rep & Compliance Manager', 'Talent Manager','Youth Development Coordinator')  or (First_Name + ' ' + Last_Name)='Rosa Nunez Pena';

CREATE VIEW [vw_worker]
 as
SELECT 
File_NBR, 
job_title, 
(First_Name + ' ' + Last_Name) as worker, 
POSITION_NBR,
Supervisor_Position_NBR, 
(Mngr_FName + ' ' + Mngr_LName ) as worker_Manager 
  FROM [New_EEs].[dbo].[ADPFile]
  where Job_title not in 
  ('Associate Vice President','Vice President','Sr VP & Chief Financial Officer','Sr. Vice President', 'Director','Chief Information Officer','Deputy Controller','Director of Operations & Staff Dev', 'Assistant Director','Supervisor','Campus Administration Manager','Compensation & Benefits Manager', 'Cottage Manager', 'Manager','Office Manager','Operations Manager','Recruiting Manager','Special Projects/Rep & Compliance Manager', 'Talent Manager','Youth Development Coordinator','Senior Performance Officer')  and  not  (First_Name + ' ' + Last_Name)='Rosa Nunez Pena';
4

1 に答える 1

0

次のような共通テーブル式を検討してください...

WITH org AS 
(
    SELECT 
        ee.POSITION_NBR, ee.EmpName, ee.Title
    FROM 
        employee AS ee
    UNION ALL 
    SELECT ee.POSITION_NBR, o.EmpName, o.Title
    FROM 
    employee AS ee 
    JOIN org o ON (o.POSITION_NBR = ee.SupervisorId)
)

SELECT * FROM org WHERE (POSITION_NBR IN (SELECT POSITION_NBR FROM employee where title = 'Worker'))

各ワーカーに対して、この再帰 CTE はワーカーの管理チェーンにあるすべての従業員を取得します。

次に、これを PIVOT して、必要な形式を取得できます。欠落している管理レベルには、自動的に NULL 値が含まれます。

完全な例については、この SQL Fiddleを参照してください。簡潔にするために、最初の 3 つの管理レベルのみを含めましたが、このパターンに従って他の管理レベルを追加できるはずです。

于 2013-07-20T01:30:11.930 に答える