2015-11-06 36 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爲您的財政年度定義? –