繁体   English   中英

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

[英]Hierarchy data from Oracle from Multiple Tables

我正在尝试从表中返回日历层次结构。 年->季度->月

由于我的表中没有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

演示版

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM