如何使用新条目复制行

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;

【讨论】:

以上是关于如何使用新条目复制行的主要内容,如果未能解决你的问题,请参考以下文章

如何给tablewidget整行条目加右键菜单

如何给tablewidget整行条目加右键菜单

如何使用 C# 删除数据表中的重复条目? [复制]

如何使用 dexie.js 添加新条目

使用宏复制时如何修改日期?

Xamarin 表单:如何复制条目值?