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;
代码解释:
- 首先用
YearRange这个CTE生成从1993到2019的所有年份; - 然后通过
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;
代码解释:
master..spt_values的type='P'会返回从0开始的连续数字;- 通过
1993 + number把数字转换成对应的年份,number <= 2019-1993确保我们只生成到2019年的数字; - 同样用
CROSS JOIN关联原表和年份序列,得到目标结果。
注意事项:
- 记得把代码中的
YourTableName替换成你实际的数据表名称; - 因为
Desc是SQL的保留关键字,所以查询时最好用方括号[Desc]包裹,避免语法错误; - 如果原表中有多行数据,这两种方法都会为每一行生成完整的年份序列,符合你的需求。
内容的提问来源于stack exchange,提问作者Aniket
相关产品推荐
相关产品推荐

