You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2012实现从指定年份到目标年份重复行的SQL查询需求

解决方案:在SQL Server 2012中生成年份序列并关联原表

别担心,这个需求在SQL Server 2012里完全可以轻松实现,我给你两种实用的方法,你可以根据实际场景选择:

方法一:使用递归CTE(适用于年份范围较小的场景)

递归CTE是生成连续序列的常用方式,代码清晰易懂:

WITH YearRange AS (
    -- 初始化起始年份
    SELECT 1993 AS Inc_Yr
    UNION ALL
    -- 递归生成后续年份,直到达到目标年份2019
    SELECT Inc_Yr + 1
    FROM YearRange
    WHERE Inc_Yr < 2019
)
SELECT 
    t.Code,
    t.[Desc],  -- 注意:Desc是SQL关键字,建议用方括号包裹
    t.Curr_Year,
    yr.Inc_Yr
FROM 
    YourTableName t  -- 替换成你实际的表名
CROSS JOIN 
    YearRange yr;

代码解释:

  1. 首先用YearRange这个CTE生成从1993到2019的所有年份;
  2. 然后通过CROSS JOIN把原表中的每一行和生成的年份序列进行关联,这样原表的一行数据就会对应每一个年份,生成多行结果。

方法二:使用系统表生成数字序列(适用于年份范围较大的场景)

如果你的年份范围很大,递归CTE可能效率稍低,这时可以利用SQL Server自带的系统表master..spt_values来生成数字序列:

SELECT 
    t.Code,
    t.[Desc],
    t.Curr_Year,
    1993 + number AS Inc_Yr
FROM 
    YourTableName t  -- 替换成你实际的表名
CROSS JOIN 
    (
        SELECT number 
        FROM master..spt_values 
        WHERE type = 'P' 
          AND number <= 2019 - 1993  -- 计算年份差,确保生成的数字范围正确
    ) nums;

代码解释:

  1. master..spt_values的type='P'会返回从0开始的连续数字;
  2. 通过1993 + number把数字转换成对应的年份,number <= 2019-1993确保我们只生成到2019年的数字;
  3. 同样用CROSS JOIN关联原表和年份序列,得到目标结果。

注意事项:

  • 记得把代码中的YourTableName替换成你实际的数据表名称;
  • 因为Desc是SQL的保留关键字,所以查询时最好用方括号[Desc]包裹,避免语法错误;
  • 如果原表中有多行数据,这两种方法都会为每一行生成完整的年份序列,符合你的需求。

内容的提问来源于stack exchange,提问作者Aniket

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:21:27