如何在财政年度每周总计可以更改的情况下制作动态报告

时间:2015-11-06 17:47:39

标签: oracle oracle11g

我想制作一份能够在不同财政年度运行的报告。

我正在撰写一份报告,其中包含我们会计年度的累积累计总数。

我们的财政年度从7月1日开始,到6月30日结束。每周的第一天是星期天。

以下是我们当前财年 - 2016年的一小部分

SELECT 
    (
    SELECT SUM(amount)
    FROM transactions
    WHERE transaction_date < '28-JUN-2015'
    ) AS 'x0',
    (
    SELECT SUM(amount)
    FROM transactions
    WHERE transaction_date < '05-JUL-2015'
    ) AS 'x1',
--keeps going until a week includes June 30.
FROM dual

我很遗憾如何继续写这篇文章。这就是我认为逻辑应该是:

假设我已将年份作为变量传递(例如“:yr”),我想检查7月1日:yr是星期日。
----如果7月1日是星期日,那么第一周将从7月1日开始 ----如果7月1日不是星期日,那么第一周将在7月1日之前的星期日开始。

在这两种情况下,随后几周将在下一个星期天开始。 当上周包括次年的6月30日时,循环将停止。

非常感谢任何帮助或指导!

2 个答案:

答案 0 :(得分:0)

如果你不介意行而不是列,你可以按周计算总和吗?

之类的东西
select
sum (amount), trunc(transaction_date, 'WW')
group by trunc(transaction_date, 'WW')
order by 2

答案 1 :(得分:0)

查看DBMS_SCHEDULER的Calendaring Syntax示例。 默认情况下,这用于SCHEDULER JOBS,但我没有看到任何不将其用于其他用途的原因。

你可以这样做:

BEGIN
    DBMS_SCHEDULER.CREATE_SCHEDULE('fiscal_year', repeat_interval => 'FREQ=YEARLY;BYDATE=0701');
END;


CREATE OR REPLACE FUNCTION GetFiscalYear(theYear IN TIMESTAMP DEFAULT LOCALTIMESTAMP) RETURN TIMESTAMP IS
    res TIMESTAMP;
BEGIN
     DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=fiscal_year;BYDAY=-1 SUN', NULL, ADD_MONTHS(TRUNC(theYear, 'YYYY'), -12), res);
    RETURN res;
END;

示例:

SELECT 
    TO_CHAR(GetFiscalYear(ADD_MONTHS(LOCALTIMESTAMP, -12)), 'yyyy-mm-dd fmDay') AS last_year,
    TO_CHAR(GetFiscalYear(), 'yyyy-mm-dd fmDay') AS this_year,
    TO_CHAR(GetFiscalYear(ADD_MONTHS(LOCALTIMESTAMP, 12)), 'yyyy-mm-dd fmDay') AS next_year
FROM dual;

LAST_YEAR            THIS_YEAR           NEXT_YEAR    
-------------------  ------------------  ----------------------
2014-06-29 Sunday    2015-06-28 Sunday   2016-06-26 Sunday

1 row selected.

<强>更新

我甚至找到了一种更短的方式(即没有额外的时间表):

CREATE OR REPLACE FUNCTION GetFiscalYear(theYear IN TIMESTAMP DEFAULT LOCALTIMESTAMP) RETURN TIMESTAMP IS
    res TIMESTAMP;
BEGIN
    -- Last Sunday of June 
    DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=YEARLY;BYMONTH=JUN;BYDAY=-1 SUN', NULL, ADD_MONTHS(TRUNC(theYear, 'YYYY'), -12), res);
    RETURN res;
END;