按财务年度计算的SQL组数据

我有一个表,年份,月份,date,项目和收入列。 每个条目都在每个月的第一个时候添加。

我必须能够在每个财政年度获得特定项目的总收入。 我到目前为止(我认为每年的工作方式)是这样的:

SELECT year, SUM(TotalIncome) FROM myTable WHERE ((date Between #1/1/2007# And #31/12/2015#) AND (project='aproject')) GROUP BY year; 

基本上,我不想每年按数据分组,我想按财年分组。 我用DatePart('yyyy', date) ,结果是一样的。

我将从excel运行查询到数据库。 我需要能够select年数(例如2009年至2014年,或2008年至2010年等)。 我将从Excel中的用户input(采取两个date,即startYear,endYear)的年份。

从目前的查询结果给我,每年将是同年1月1日至12月31日的数据:

 Year | Income 2009 | $123.12 2010 | $321.42 2011 | $231.31 2012 | $426.37 

我希望结果看起来像这样,每个财政年度将在次年的7月1日至6月30日:

 FinancialYear | Income 2009-10 | $123.12 2010-11 | $321.42 2011-12 | $231.31 2012-13 | $426.37 

如果可能的话,我也希望能够每季度做一次。

另外,如果它很重要,我有只读访问,所以我不能做任何修改数据库。

这还没有经过testing,但逻辑与SQL查询的答案相同, 以检索按年份分组的财务年度数据 。

 SELECT fy.FinancialYear, SUM(fy.TotalIncome) FROM ( SELECT IIF( MONTH(date) >= 7, YEAR(date) & "-" & YEAR(date)+1, YEAR(date)-1 & "-" & YEAR(date) ) AS FinancialYear, TotalIncome FROM myTable WHERE date BETWEEN #1/1/2007# AND #31/12/2015# AND project = 'aproject' ) AS fy GROUP BY fy.FinancialYear; 

进一步扩展你可以得到每季度以及:

 SELECT fy.FinancialQuarter, SUM(fy.TotalIncome) FROM ( SELECT IIF( MONTH(date) >= 10, "Q2-" & YEAR(date) & "-" & YEAR(date)+1, IIF( MONTH(date) >= 7, "Q1-" & YEAR(date) & "-" & YEAR(date)+1, IIF( MONTH(date) >= 4, "Q4-" & YEAR(date)-1 & "-" & YEAR(date), "Q3-" & YEAR(date)-1 & "-" & YEAR(date) ) ) ) AS FinancialQuarter, TotalIncome FROM myTable WHERE date BETWEEN #1/1/2007# AND #31/12/2015# AND project = 'aproject' ) AS fy GROUP BY fy.FinancialQuarter; 

您需要创build一个financial_year

 financial_year_id int primary key period varchar startDate date endDate date 

与这个数据

 1 | 2009-10 | #1/1/2009# | #1/1/2010# 2 | 2010-11 | #1/1/2010# | #1/1/2011# 3 | 2011-12 | #1/1/2011# | #1/1/2012# 4 | 2012-13 | #1/1/2012# | #1/1/2013# 

然后使用原始表进行连接

  SELECT FY.period, SUM (YT.TotalIncome) FROM YourTable YT INNER JOIN financial_year FY ON YT.date >= FY.startDate and YT.date < FY.endDate GROUP BY FY.period 

季度:

  SELECT FY.period, DatePart ('q', date) as quarter, SUM (YT.TotalIncome) FROM YourTable YT INNER JOIN financial_year FY ON YT.date >= FY.startDate and YT.date < FY.endDate GROUP BY FY.period, DatePart ('q', date) 

注意

我不确定你的datedate还是datetime所以我去了最安全的方式

如果只是你可以使用的date

 1 | 2009-10 | #1/1/2009# | #31/12/2009# 2 | 2010-11 | #1/1/2010# | #31/12/2010# 

 ON YT.date BETWEEN FY.startDate AND FY.endDate 

这是非常简单的使用DateAdd六个月的时间:

 SELECT Format(DateAdd("m", 6, [Date]), "yyyy") & Format(DateAdd("m", 18, [Date]), "\-yy") As FinancialYear, SUM(TotalIncome) As Income FROM myTable WHERE ([date] Between #1/1/2007# And #31/12/2015#) AND (project="aproject") GROUP BY DateAdd("m", 6, [Date]), Format(DateAdd("m", 6, [Date]), "yyyy") & Format(DateAdd("m", 18, [Date]), "\-yy") 

由于您无法创build新表(只读访问),您可以在select之前使用语句来创build可用于查询的财务年数“表”。

 with financial_year as ( select '2009' as year, '1/1/2009' as start_date, '31/12/2009' as end_date union select '2010' as year, '1/1/2010' as start_date, '31/12/2010' as end_date ... ) SELECT FY.year, SUM (YT.TotalIncome) FROM YourTable YT INNER JOIN financial_year FY ON YT.date >= FY.start_date and YT.date <= FY.end_date GROUP BY FY.year 

这将工作(微小的修改)与MS SQL服务器和甲骨文,我不知道你的数据库是什么寿。