我想制作一份能够在不同财政年度运行的报告。
我正在撰写一份报告,其中包含我们会计年度的累积累计总数。
我们的财政年度从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日时,循环将停止。
非常感谢任何帮助或指导!
答案 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;