按财务年度计算的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)
注意
我不确定你的date
是date
还是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服务器和甲骨文,我不知道你的数据库是什么寿。