按财政年度列出的SQL组数据

按财政年度列出的SQL组数据,sql,excel,ms-access,financial,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; 基本上,我不想按年度对数据进行分组,而是想按财政年度对结果

我有一个表,有年、月、日、项目和收入列。每个条目在每个月的第一天添加

我必须能够得到每个财政年度某一特定项目的总收入。到目前为止,我认为每年都有用的东西是什么?是这样的:

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到数据库的查询。我需要能够选择年数,例如2009年至2014年,或2008年至2010年等。我将从用户在excel中输入的年数中选择两个日期,即开始日期和结束日期

根据当前查询的结果,每年的数据为同年1月1日至12月31日:

Year           |  Income
2009           |  $123.12
2010           |  $321.42
2011           |  $231.31
2012           |  $426.37
我希望结果如下所示,每个财政年度为次年7月1日至6月30日:

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

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

您需要创建一个财务年度表

用这些数据

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


这非常简单,使用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") 

这还没有经过测试,但逻辑与来自的答案相同

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

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;

由于无法创建新表,所以可以在选择之前使用with语句以只读访问方式创建可从查询中使用的财政年度表

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 server和Oracle,只需稍作修改即可。我不确定您的数据库是什么。

您的查询有什么问题?任何错误或未返回您想要的内容?当前查询应按年度返回,我需要它返回每个财政年度的条目,例如2014年7月1日至2015年6月30日。但您查询的是工作还是您想象的那样?我的意思是,一年是否是一个领域?但每年都不是一个财政年度,只是一个正常的一年。我不是自己创建表的,但我认为年份字段在已经有日期字段的情况下似乎是多余的。对于按财政年度分组,请参阅使用DatePart,得出相同的结果。例如,我可以成功获取2007年的信息,该年被定义为2007年1月1日至2007年12月31日之间。但我想获得2007-2008财年的信息,所以在2007年7月1日至2008年6月30日之间。我想你没有阅读我的上一次编辑,但我对数据库具有只读访问权限:我无法创建新表。抱歉,我没有读到。我只是更新它,使它更可见。据我所知,这是伟大的工程!非常感谢你!等等,实际上这似乎给了我一个奇怪的输出。看看2007年1月1日至2015年12月31日之间的相同日期[日期],我也看到了2015-2016年和2016-2017年。这些年份甚至没有任何条目。由于您没有指定财政年度相对于日历年是向前移动还是向后移动,所以我假设是向前移动。如果是向后的,则分别对两个移位值使用-6和6。这个问号是access,也有sql标记,有什么原因你没有提到这个吗?原因是sql并不意味着sql server。这应该可以正常工作,不过我还没有测试过季度的。谢谢你的帮助!
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
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") 
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;
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