按财政年度列出的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