我正在尝试扩展另一篇文章以满足我的需求。我正在尝试根据我们的会计期间建立一个日历,似乎正在创建一个无限循环,或者说一个太大的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中将不提供提示。
谢谢
答案 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