财务年度的SQL组数据

时间:2015-10-24 11:39:17

标签: 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;

基本上,我不是按年度对数据进行分组,而是按财务年度对结果进行分组。我使用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

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

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

如果可能的话,我也希望每个季度能够做到这一点。

  

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

4 个答案:

答案 0 :(得分:2)

您需要创建一个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#

AND

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

答案 1 :(得分:1)

这还没有经过测试,但逻辑与SQL query to retrieve financial year data grouped by the year的答案相同。

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;

答案 2 :(得分:0)

使用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") 

答案 3 :(得分:0)

由于您无法创建新表(只读访问权限),因此您可以在选择之前使用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服务器和Oracle都有效(稍作修改),我不确定你的数据库是什么。