2016-10-23 12 views
2

設定:PS_POSITION_TBLフラットな結果に階層データのためのSQLクエリを必要とするが、テーブルあります

position_nbr  reports_to    descr   
038    143      DIRECTOR 
0418    143      ADVISOR       
114    143      DG        
346    114      Manager       
202    114      Lead 

我々は上記

た場合の階層を構築したいアイデア1:038、0418および114のレポートへ143

ケース2:114

ように最高レベルの346と202のレポートは、彼らが次にレベル1 346に報告し、202ルであるとして143は、次に、038,0418,114はレベル2であるであり、レベル1でありますVEL 3と、彼らはレベル3バケット に該当し、彼らはこれらは私が必要なもののレベル8(MAX)

まで行くことができるレベル2

に報告では、Oracleで以下の形式でデータを取得するクエリです:

level1 level2 level3 level4 level5 level6 level7 level8  descr 
143                CEO    
      038             DIRECTOR   
      0418             ADVISOR   
      114             DG    
        346           Manager   
        202           Lead  
+1

位置143は、あなたのテーブルではありません。 'descr'が何であるかあなたはどのように知っていますか? –

答えて

1
select level1,level2,level3,level4,level5,level6,level7,level8,descr 

from  (select  level as n,position_nbr as id,descr,position_nbr 

      from   (  select position_nbr ,reports_to ,descr from PS_POSITION_TBL 
         union all select 143   ,null  ,'CEO' from dual 
         ) t 

      start with reports_to is null 

      connect by reports_to = prior position_nbr 
     ) 
      pivot (max(position_nbr) for n in (1 as level1,2 as level2,3 as level3,4 as level4,5 as level5,6 as level6,7 as level7,8 as level8)) 
; 

または

select decode (n,1,position_nbr) as level1 
     ,decode (n,2,position_nbr) as level2 
     ,decode (n,3,position_nbr) as level3 
     ,decode (n,4,position_nbr) as level4 
     ,decode (n,5,position_nbr) as level5 
     ,decode (n,6,position_nbr) as level6 
     ,decode (n,7,position_nbr) as level7 
     ,decode (n,8,position_nbr) as level8 
     ,descr 

from  (select   level as n,position_nbr,descr 

      from   (  select position_nbr ,reports_to ,descr from PS_POSITION_TBL 
         union all select 143   ,null  ,'CEO' from dual 
        ) t 

      start with reports_to is null 

      connect by reports_to = prior position_nbr 
     ) 
; 
+0

これは正しい考えですが、データから見つけ出す代わりに143をハードコードします。 143は、例えば、position_nbrにないreports_toとは異なるものを選択することによって見つけることができる。 – mathguy

+0

@mathguy、あなたは私のように推測しているだけです。あなたは、143がposition_nbrにないことを知らない(そしてあなたはこのような記述を得るつもりはない) –

+0

143がposition_nbrにある場合、それはレベル1ではない?それがポイントです!また、説明はNULLのままにしてください。出力でOPが示していることは、入力データまたは問題要件のどこにもありません。 (これは後者の中に置くことができます。たとえば、説明がないレベル1のIDの場合は、説明のために 'CEO'をハードコードします。) – mathguy

1

次のクエリは、あなたのLEVELで左詰め階層セット、与える:あなたはDに満足していない場合は

SELECT LPAD(' ', level * 2, ' ') || TO_CHAR(position_nbr), descr 
    FROM PS_POSITION_TBL 
CONNECT BY PRIOR position_nbr = reports_to 
START WITH reports_to IS NULL; 

を1列(LEVEL)のレベルを表示し、各レベルの列が必要な場合は、LEVELに基づいてPIVOTを使用できますが、順序が問題になります。

関連する問題