sql - 需要对平面结果集中的分层数据进行 SQL 查询

标签 sql oracle pivot recursive-query

有一个表:PS_POSITION_TBL

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:346和202向114举报

因此最高级别是 level1,即 143,然后 038,0418,114 是 2 级,因为它们向 1 级报告,然后 346 和 202 是 3 级,它们属于 3 级存储桶,并向 2 级报告

这些最高可达 8 级(最大)

我需要一个查询来获取 Oracle 中以下格式的数据:

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

最佳答案

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

关于sql - 需要对平面结果集中的分层数据进行 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40203067/

相关文章:

oracle - 对未初始化集合 PL/SQL 的引用

python - 重组 Pandas 中的无关数据

c# - 从 SQL 2008 获取 DateTimeOffset 值到 C#

oracle - Hibernate 的 saveOrUpdate 忽略非空列属性

MYSQL - 计算每个表中的行数

java - 引用的 Jar 中的 Log4J JDBC SQL 错误

mysql数据透视表,具有所选行的连续和数据透视计数

python - 旋转 Pandas 表 - 特殊问题

sql - 在 COUNT 中选择

sql - 如何使用 Schemabound 创建包含来自 2 个不同数据库的表的索引 View