我有一个具有ID,开始和结束日期的SQL表。例如,
ID StartDt EndDt
123 1/1/2010 12/31/2014
456 7/16/2013 11/20/2014
根据10月至9月的FY日历,我可以从日期(例如,ID 123的2010年和2015年)获得FY。但是,我想用最初和最后一个FY复制该行;以及中间的财政年度。以下是我希望从上面的数据行中获得的内容:
ID FY
123 2010
123 2011
123 2012
123 2014
123 2015
456 2013
456 2014
答案 0 :(得分:1)
您可以使用递归cte
获取所有可能年份的列表,然后使用JOIN
:
;with cte AS (SELECT 2010 AS Yr
UNION ALL
SELECT Yr + 1
FROM cte
WHERE Yr < 2015)
SELECT a.ID, b.Yr
FROM YourTable a
JOIN cte b
ON b.Yr BETWEEN YEAR(a.StartDt) AND YEAR(a.EndDt)
答案 1 :(得分:1)
您需要一个数字列表。一种方便的方法是master..spt_values
:
with n as (
select row_number() over (order by (select NULL)) - 1 as n
from master..spt_values
)
select id, year(t.startDt) + n.n as fy
from table t join
n
on dateadd(year, n.n, t.startDt) <= t.endDt;
答案 2 :(得分:1)
下面的查询使用递归CTE来计算从开始日期会计年度到结束日期会计年度的年份。
;WITH CTE AS (
SELECT
ID,
YEAR(StartDt) AS FY,
YEAR(EndDt) AS EY
FROM [Source]
UNION ALL
SELECT
ID,
FY + 1,
EY
FROM CTE
WHERE FY < EY
)
SELECT ID, FY FROM CTE ORDER BY ID, FY