Oracle-使用CONNECT BY LEVEL

时间:2018-06-19 23:14:00

标签: sql oracle

我正在尝试扩展另一篇文章以满足我的需求。我正在尝试根据我们的会计期间建立一个日历,似乎正在创建一个无限循环,或者说一个太大的SQL正在压缩查询。程序解决方案在我要构建的环境中不起作用,我只能使用软件的内置功能,否则会违反我的支持协议。

我将分解一些输出,以便您可以看到原始数据。

select distinct ap.accounting_year, ap.accounting_period, ap.date_from, ap.date_until
    from accounting_period ap
    where ap.accounting_period not in (0,13) and ap.accounting_year = :FY 
    order by ap.accounting_year, ap.accounting_period

这将输出以下内容

2018    1   01-OCT-17   28-OCT-17
2018    2   29-OCT-17   25-NOV-17
2018    3   26-NOV-17   30-DEC-17
2018    4   31-DEC-17   27-JAN-18
2018    5   28-JAN-18   24-FEB-18
2018    6   25-FEB-18   31-MAR-18
2018    7   01-APR-18   28-APR-18
2018    8   29-APR-18   26-MAY-18
2018    9   27-MAY-18   30-JUN-18
2018    10  01-JUL-18   28-JUL-18
2018    11  29-JUL-18   25-AUG-18
2018    12  26-AUG-18   29-SEP-18

现在,当我运行以下查询时,我在该查询期间添加了一个额外的提示,以将上述结果限制为1行,并且一切正常。

WITH 
fiscal as (
    select distinct ap.accounting_year, ap.accounting_period, ap.date_from, ap.date_until
    from accounting_period ap
    where ap.accounting_period not in (0,13) and ap.accounting_year = :FY and ap.accounting_period = :FP 
    order by ap.accounting_year, ap.accounting_period       
),
calendar AS (
     SELECT f.accounting_year, f.accounting_period, f.date_from + ROWNUM -1 fiscal_day
       FROM dual, fiscal f
     CONNECT BY LEVEL <= f.date_until - f.date_from + 1
)
select * from  calendar;

输出;

2018    9   27-MAY-18
2018    9   28-MAY-18
2018    9   29-MAY-18
2018    9   30-MAY-18
2018    9   31-MAY-18
2018    9   01-JUN-18
2018    9   02-JUN-18
2018    9   03-JUN-18
2018    9   04-JUN-18
2018    9   05-JUN-18
2018    9   06-JUN-18
2018    9   07-JUN-18
2018    9   08-JUN-18
2018    9   09-JUN-18
2018    9   10-JUN-18
2018    9   11-JUN-18
2018    9   12-JUN-18
2018    9   13-JUN-18
2018    9   14-JUN-18
2018    9   15-JUN-18
2018    9   16-JUN-18
2018    9   17-JUN-18
2018    9   18-JUN-18
2018    9   19-JUN-18
2018    9   20-JUN-18
2018    9   21-JUN-18
2018    9   22-JUN-18
2018    9   23-JUN-18
2018    9   24-JUN-18
2018    9   25-JUN-18
2018    9   26-JUN-18
2018    9   27-JUN-18
2018    9   28-JUN-18
2018    9   29-JUN-18
2018    9   30-JUN-18

最后,我希望能够运行此命令以输出所有12个期间的记录并创建会计年度日历,因为该视图在当前数据库中不存在。

如果需要,我可以发布整个查询,但这就是我的棘手问题,我可以通过在WITH子句中添加提示选择会计年度和期间的提示来构建脚本的其余部分,但是当我实现此功能时在最终报告中,我将必须创建一个视图,在该视图中,在WITH中将不提供提示。

谢谢

1 个答案:

答案 0 :(得分:0)

如果我很了解您的需求,那么可能就是您所需要的:

select accounting_year, accounting_period, date_from, date_until, date_from + level -1 as calendare_date
from yourResult
   connect by date_from + level -1 <= date_until
     and prior accounting_year = accounting_year
     and prior accounting_period = accounting_period
     and prior sys_guid() is not null
order by accounting_year, accounting_period    

例如,数据量减少了:

with yourResult(accounting_year, accounting_period, date_from, date_until) as (
    select    2018, 1 , to_date('01-OCT-17', 'dd-mon-yy'), to_date('05-OCT-17', 'dd-mon-yy') from dual union all
    select    2018, 2 , to_date('06-OCT-17', 'dd-mon-yy'), to_date('07-OCT-17', 'dd-mon-yy') from dual union all
    select    2018, 3 , to_date('08-OCT-17', 'dd-mon-yy'), to_date('10-oct-17', 'dd-mon-yy') from dual
)
select accounting_year, accounting_period, date_from, date_until,
       date_from + level -1 as calendare_date
from yourResult
   connect by date_from + level -1 <= date_until
     and prior accounting_year = accounting_year
     and prior accounting_period = accounting_period
     and prior sys_guid() is not null
order by accounting_year, accounting_period; 

您有:

ACCOUNTING_YEAR ACCOUNTING_PERIOD DATE_FROM DATE_UNTI CALENDARE
--------------- ----------------- --------- --------- ---------
           2018                 1 01-OCT-17 05-OCT-17 01-OCT-17
           2018                 1 01-OCT-17 05-OCT-17 02-OCT-17
           2018                 1 01-OCT-17 05-OCT-17 03-OCT-17
           2018                 1 01-OCT-17 05-OCT-17 04-OCT-17
           2018                 1 01-OCT-17 05-OCT-17 05-OCT-17
           2018                 2 06-OCT-17 07-OCT-17 06-OCT-17
           2018                 2 06-OCT-17 07-OCT-17 07-OCT-17
           2018                 3 08-OCT-17 10-OCT-17 08-OCT-17
           2018                 3 08-OCT-17 10-OCT-17 09-OCT-17
           2018                 3 08-OCT-17 10-OCT-17 10-OCT-17