Sql server 为SQL server序列生成缺少的年份

Sql server 为SQL server序列生成缺少的年份,sql-server,Sql Server,我有一个表格需要分析,几年来数据都不见了,我想反映一下。前两列是位置代码,后两列是最近输入的年份。我可以得到每个位置的最小值和最大值,但我想创建一个这样的序列,以连接到另一个表。每个位置都有不同的年份范围,因此基本上我必须创建一个单独的范围,给出每个位置的最小值和最大值 给定结果 (Location Cds) Start End 0160, 002, 1995, 2009 0160, 001, 1995, 1997 目标结果 (Location Cds) Y

我有一个表格需要分析,几年来数据都不见了,我想反映一下。前两列是位置代码,后两列是最近输入的年份。我可以得到每个位置的最小值和最大值,但我想创建一个这样的序列,以连接到另一个表。每个位置都有不同的年份范围,因此基本上我必须创建一个单独的范围,给出每个位置的最小值和最大值

给定结果

(Location Cds)  Start   End
0160,   002,    1995,   2009
0160,   001,    1995,   1997
目标结果

(Location Cds)  Years
0160,   001,    1995
0160,   001,    1996
0160,   001,    1997
0160,   002,    1995
0160,   002,    1996
0160,   002,    1997
0160,   002,    1998
0160,   002,    1999
0160,   002,    2000
0160,   002,    2001
0160,   002,    2002
0160,   002,    2003
0160,   002,    2004
0160,   002,    2005
0160,   002,    2006
0160,   002,    2007
0160,   002,    2008
0160,   002 ,   2009

理货表就是这个挑战的答案。它被称为t-sql的瑞士军刀,理由很充分。它可以做人们通常认为是循环的所有事情。这是杰夫·摩登(Jeff Moden)写的一篇讨论理货表的优秀文章

我喜欢在我的系统上保留一个视图,该视图几乎可以在零读取的情况下立即生成10000行。这就是这个观点

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally
GO
然后,当您遇到像您正在处理的问题这样具有挑战性的查询时,它非常简单。下面是一个完整的工作示例,包括您发布的问题的ddl。在本例中,您将直接对表运行这种类型的查询。我使用了一个table变量,因为我没有可以使用的表

declare @Something table 
(
    Location varchar(10)
    , Cds varchar(10)
    , YearStart int
    , YearEnd int
)

insert @Something
(
    Location
    , Cds
    , YearStart
    , YearEnd
) values
('0160', '002', 1995, 2009)
, ('0160', '001', 1995, 1997)

select s.Location
    , s.Cds
    , Years = x.N 
from @Something s
cross apply
(
    select *
    from cteTally t
    where t.N >= s.YearStart
        and t.N <= s.YearEnd
) x
order by s.Location 
    , s.Cds
    , x.N

这就是理货台发挥作用的地方。你能发布你的表格定义吗?或者至少这些数据是什么?@SeanLange我基本上是按照位置代码进行分区,并获取第一年和最后一年的记录。我想从这个数据集创建第二个数据集,填充从开始到结束的任何年份。