如何使用新条目复制行
Posted
技术标签:
【中文标题】如何使用新条目复制行【英文标题】:How to duplicate Rows with new entries 【发布时间】:2015-05-12 01:43:57 【问题描述】:我有一个包含 ID、开始和结束日期的 SQL 表。例如,
ID StartDt EndDt
123 1/1/2010 12/31/2014
456 7/16/2013 11/20/2014
根据 10 月至 9 月 FY 日历,我可以从日期中获取 FY(例如,ID 123 的 2010 年和 2015 年)。但是,我想复制具有初始和最后一个 FY 的行;以及介于两者之间的财年。以下是我想从上面的数据行中得到的:
ID 财政年度
123 2010
123 2011
123 2012
123 2014
123 2015
456 2013
456 2014
【问题讨论】:
【参考方案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
【讨论】:
谢谢。它很快。谢谢大家。【参考方案2】:您可以使用递归的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)
【讨论】:
【参考方案3】:您需要一个数字列表。一个方便的方法是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;
【讨论】:
以上是关于如何使用新条目复制行的主要内容,如果未能解决你的问题,请参考以下文章