按财政年度的 SQL 组数据

Spi*_*der 4 sql excel ms-access financial

我有一个包含年、月、日期、项目和收入列的表格。每个条目都会在每月的第一天添加。

我必须能够获得每个财政年度特定项目的总收入。到目前为止我所得到的(我认为每年都有效?)是这样的:

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

本质上,我不想按年份对数据进行分组,而是想按财政年度对结果进行分组。我用过DatePart('yyyy', date),结果是一样的。

我将运行从 Excel 到数据库的查询。我需要能够选择年数(例如2009年至2014年,或2008年至2010年等)。我将从 Excel 中的用户输入中获取年份(获取两个日期,即 startYear、endYear)。

当前查询的结果给我,每年都是同年 1 月 1 日到 12 月 31 日的数据:

Year           |  Income
2009           |  $123.12
2010           |  $321.42
2011           |  $231.31
2012           |  $426.37
Run Code Online (Sandbox Code Playgroud)

我希望结果看起来像这样,其中每个财政年度为 7 月 1 日至次年 6 月 30

FinancialYear  |  Income
2009-10        |  $123.12
2010-11        |  $321.42
2011-12        |  $231.31
2012-13        |  $426.37
Run Code Online (Sandbox Code Playgroud)

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

另外,如果重要的话,我具有只读访问权限,因此我无法对数据库进行任何修改。

cod*_*rsl 5

这尚未经过测试,但逻辑与 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;
Run Code Online (Sandbox Code Playgroud)

进一步扩展,您还可以每季度获得:

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;
Run Code Online (Sandbox Code Playgroud)