来自多个表的 Oracle 的层次结构数据

Hierarchy data from Oracle from Multiple Tables

我正在尝试从我的 table 中 return 日历层次结构。 年 -> 季度 -> 月

因为我的 table 中没有 ID 和父 ID 映射,我使用 ROW_NUMBER() 概念映射相关数据并使用 UNION 列出具有不同列的分层数据.

这是我的代码:

SELECT  ROW_NUMBER() OVER (ORDER BY parent_cal_id, cal_year, cal_quarter, cal_month) 
        cal_id,
        cal_data, 
        cal_month, 
        cal_quarter, 
        cal_year, 
        parent_cal_id 
from    (
          select * from 
          (
            select  FISCAL_YEAR cal_data, NULL cal_month, NULL cal_quarter, NULL cal_year, 0  parent_cal_id
            from    MFP_MASTER.FISCAL_CALENDAR
            where   WEEK_BEGIN_DATE > to_date('01012019', 'DDMMYYYY')
                    and WEEK_END_DATE < to_date('31122019', 'DDMMYYYY')
            order by FISCAL_YEAR 
          )
          union
          select * from 
          (
            select  FISCAL_QUARTER cal_data, NULL cal_month, FISCAL_QUARTER, FISCAL_YEAR, 1
            from    MFP_MASTER.FISCAL_CALENDAR
            where   WEEK_BEGIN_DATE > to_date('01012019', 'DDMMYYYY')
                    and   WEEK_END_DATE < to_date('31122019', 'DDMMYYYY')
            order by FISCAL_YEAR, FISCAL_QUARTER 
          )
          union
          select * from 
          (
            select  FISCAL_MONTH cal_data, FISCAL_MONTH cal_month, FISCAL_QUARTER, FISCAL_YEAR, 2
            from    MFP_MASTER.FISCAL_CALENDAR
            where   WEEK_BEGIN_DATE > to_date('01012019', 'DDMMYYYY')
                    and WEEK_END_DATE < to_date('31122019', 'DDMMYYYY')
            order by FISCAL_YEAR, FISCAL_QUARTER, FISCAL_MONTH 
          )
 ) order by 1 ;

但我想要如下数据,

ID      | DATA    | PARENT_ID
-------+----------+----------------
1       | 2019    | 0
2       | Q1      | 1
3       | Q2      | 1
4       | Q3      | 1
5       | Q4      | 1
6       | Jan     | 2
7       | Feb     | 2
8       | Mar     | 2
9       | Apr     | 3
10      | May     | 3
11      | Jun     | 3

我如何使用我的查询实现这一点?请帮忙解决这个问题。

根据列 week_date_date,您可以构造这样一个逆透视查询:

with  t as
( 
  select distinct data, col as parent_id
    from  
    (  
      select to_char(week_date_date,'yyyy') as cal_year,
             concat('Q',to_char(week_date_date,'Q')) as cal_quarter,
             to_char(week_date_date,'Mon') as cal_month
        from fiscal_calendar
        ) 
        unpivot (data for col in (cal_year as '0', cal_quarter as '1', cal_month as '2') ) 

)  
select row_number() over (order by parent_id, case when parent_id = 1
                                         then data 
                                         end, case when parent_id = 2
                                         then to_date(data,'mm') 
                                         end) as id,
       t.* 
  from t;

ID  DATA  PARENT_ID
--  ----  --------- 
1   2019  0
2   Q1    1
3   Q2    1
4   Q3    1
5   Q4    1
6   Jan   2
7   Feb   2
8   Mar   2
9   Apr   2
10  May   2 
11  Jun   2
12  Jul   2
13  Aug   2
14  Sep   2
15  Oct   2
16  Nov   2
17  Dec   2

Demo