需要SQL查询平面结果集中的分层数据

需要SQL查询平面结果集中的分层数据,sql,oracle,pivot,recursive-query,Sql,Oracle,Pivot,Recursive Query,有一张桌子:位置 position\u nbr向descr报告 038143主任 0418 143顾问 114 143 DG 346114经理 202 114铅 我们想在上面建立一个层次结构的想法 案例1:0380418和114向143报告 案例2:346和202向114报告 因此,最高级别为1级143,然后0380418114为2级,因为他们向1级报告,然后346和202为3级,属于 三级铲斗,他们向二级报告 这些可以上升到级别8(最大值) 我需要的是在Oracle中以以下格式获取数据的查询

有一张桌子:位置

position\u nbr向descr报告
038143主任
0418 143顾问
114 143 DG
346114经理
202 114铅
我们想在上面建立一个层次结构的想法

案例1:0380418和114向143报告

案例2:346和202向114报告

因此,最高级别为1级143,然后0380418114为2级,因为他们向1级报告,然后346和202为3级,属于 三级铲斗,他们向二级报告

这些可以上升到级别8(最大值)

我需要的是在Oracle中以以下格式获取数据的查询:

level1 level2 level3 level4 level5 level6 level7 level8除鳞器
143首席执行官
038主任
0418顾问
114 DG
346经理
202铅

以下查询将为您提供一个层次集,左侧填充有
级别

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;
如果您不满意在单个列中显示级别(
level
),并且每个级别都需要一列,则可以使用“基于
level
”,但这会导致排序出现问题

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))
;


143号位置不在您的表格中。你怎么知道描述是什么?这是正确的想法,但是它硬编码143而不是从数据中找到它。143可以通过以下方式找到:例如,选择distinct from reports\u to which not in position\u nbr.@mathguy,你只是在猜测,就像我做的那样。你不知道143不在位置_nbr(你不会得到这样的描述)如果143在位置_nbr,那么它不是1级,是吗?这就是重点!并且说明应保留为空;OP在输出中显示的内容在输入数据或问题需求中都没有。(可以放在后者中,例如“对于没有描述的1级id,硬代码‘CEO’用于描述。”)@mathguy,一点也不。143可能位于位置\u nbr和级别1,如果报告\u to为空。由于这个问题还不清楚,我提出了一个解决方案,根据给定的数据来解决这个问题。@jujadhav,它回答了你的问题吗?
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
          ) 
;