2015-11-06 64 views
0

我想为能够在不同会计年度运行的报表生成报表。如何在会计年度每周可以更改的会计年度总计中生成动态报表

我正在撰写一份报告,该报告按我们的会计年度累计总计。

我们的财政年度从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 

我失去了对如何与写这个进行。这是我在想的逻辑应该是:

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

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

任何帮助或指导将不胜感激!

回答

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; 
0

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

select 
sum (amount), trunc(transaction_date, 'WW') 
group by trunc(transaction_date, 'WW') 
order by 2 
+0

我当然喜欢行与列的想法(最终用户只需将行转换为列,以满足Excel的需要)。看起来你的解决方案数据显示,7月1日这一周的日子是一周中的第一天。当我在寻找时,我们的第一周应该是某个特定年份的7月1日或之前的星期日。 – 4ccc4

+0

难道你不只是增加一个抵销到transcaction日期accomadate为您的财政年度定义? –