我有一张包含年,月,日,项目和收入列的表格。每个条目都在每个月的第一天添加。
我必须能够获得每个财政年度特定项目的总收入。我到目前为止所做的事情(我认为每年都有效吗?)是这样的:
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
如果可能的话,我也希望每个季度能够做到这一点。
此外,如果重要,我有只读访问权限,因此我无法对数据库进行任何修改。
答案 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)
注意强>
我不确定您的date
是date
还是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都有效(稍作修改),我不确定你的数据库是什么。