财政年度年初至今累计

Posted

技术标签:

【中文标题】财政年度年初至今累计【英文标题】:year to date running total for fiscal year 【发布时间】:2016-08-11 07:18:48 【问题描述】:
SELECT DISTINCT
    ACCOUNTDATE
    ,PROPERTYNAME
    ,rt.management
from aaa t
cross apply     
    (select SUM(MANAGEMENT) as management
     from aaa
     where 
     PROPERTYNAME = t.PROPERTYNAME and
     ACCOUNTDATE BETWEEN dateadd(MONTH, datediff(MONTH, 0,t.ACCOUNTDATE),0) -- start of month
AND t.ACCOUNTDATE 
    ) as rt
WHERE AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN
ORDER BY AccountDate

这是查找本月至今的查询。 如何从同一查询中查找财政年度的年初至今? 例如:从 01/04/2015-31/03/2016 运行总计

【问题讨论】:

【参考方案1】:

不确定从哪一天开始您需要 FY 开始。假设来自@STARTOFMONTH_MAN。然后你可以让 FY 开始为

declare @fymonth int = 4; -- first month of FY.

declare @STARTOFMONTH_MAN date = '20160320';
select  fyStart = dateadd(MONTH,
                @fymonth - CASE WHEN month(@STARTOFMONTH_MAN) >= @fymonth THEN 1 ELSE 13 END,
                dateadd(YEAR, datediff(YEAR, 0, @STARTOFMONTH_MAN),0));

您可以通过创建日历表来简化这些日期的计算。

编辑 想法是用较大的间隔限制 WHERE 中的数据,并有条件地对子间隔求和数据。

declare @fymonth int = 4; -- first month of FY.

SELECT DISTINCT
    ACCOUNTDATE
    ,PROPERTYNAME
    ,rt.FYManagement, rt.MonthManagement
FROM aaa t
CROSS APPLY     
    (SELECT 
        SUM(t2.MANAGEMENT) AS FYManagement
        ,SUM(CASE WHEN t2.ACCOUNTDATE BETWEEN 
                -- start of month for t.ACCOUNTDATE
            dateadd(MONTH, datediff(MONTH, 0, t3.ACCOUNTDATE), 0)
            AND t3.ACCOUNTDATE
         THEN t2.MANAGEMENT END) AS MonthManagement
     from aaa t2
     JOIN aaa t3 ON t3.primarykey = t.primarykey -- change as needed to get 1 to 1 JOIN
     where 
     t2.PROPERTYNAME = t.PROPERTYNAME and
     t2.ACCOUNTDATE BETWEEN 
                -- FY start for t.ACCOUNTDATE
                dateadd(MONTH,
                  @fymonth - CASE WHEN month(t.ACCOUNTDATE) >= @fymonth THEN 1 ELSE 13 END,
                  dateadd(YEAR, datediff(YEAR, 0, t.ACCOUNTDATE), 0));
                AND t.ACCOUNTDATE 
    ) as rt
WHERE AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN
ORDER BY AccountDate

【讨论】:

感谢您的帮助。我需要从每年的 4 月 1 日开始财政年度,这将是动态的。在此查询中,例如:从 2015 年 1 月 4 日到 2016 年 3 月 31 日的总计必须重置。 我明白了。我的意思是您的查询取决于限制期限的参数。第一个参数的 FY 开始时间可能是 01.04.2015,第二个参数的 FY 开始时间可能是 01.04.2016。在子查询中是否应该考虑到这一点? 这不起作用,错误消息是 //// 在包含外部引用的聚合表达式中指定了多个列。如果要聚合的表达式包含外部引用,则该外部引用必须是表达式中引用的唯一列。 我更新了答案,请参阅JOIN aaa t3 解决方法。您需要使用真正的 aaa 的主键更改 ON 子句。【参考方案2】:

声明@fymonth int = 4; -- FY 的第一个月。

选择不同的 帐户日期 ,属性名 ,rt.FYManagement, rt.MonthManagement 来自 aaa t 交叉申请 (选择 SUM(t2.MANAGEMENT) 作为 FYManagement ,SUM(t2.AccountDATE BETWEEN 时的情况 -- t.ACCOUNTDATE 的月初 dateadd(MONTH, datediff(MONTH, 0, t3.ACCOUNTDATE), 0) 和 t3.AccountDATE 然后 t2.MANAGEMENT END) 作为 MonthManagement 从aaa t2 JOIN aaa t3 ON t3.primarykey = t.primarykey -- 根据需要更改以获得 1 到 1 JOIN 在哪里 t2.PROPERTYNAME = t.PROPERTYNAME 和 t2.帐户之间的日期 -- t.ACCOUNTDATE 财年开始 添加日期(月, @fymonth - CASE WHEN month(t.ACCOUNTDATE) >= @fymonth THEN 1 ELSE 13 END, dateadd(YEAR, datediff(YEAR, 0, t.ACCOUNTDATE), 0)); 和 t.AccountDATE ) 作为 rt 在 @STARTOFMONTH_MAN 和 @ENDOFMONTH_MAN 之间的帐户日期 按帐户日期订购

【讨论】:

以上是关于财政年度年初至今累计的主要内容,如果未能解决你的问题,请参考以下文章

sap事务类型哪些可以跨年

我如何回应财政年度?

数学计算财政年度 5-4-4 时间表

计算财政年度和季度

财政年度末(fiscal year-end)

财政年度末(fiscal year-end)