两列之间的差分为两行

我无法解释我的问题,但是我有这张桌子

ID  START   END
1   10      12
2   30      31
3   11      13

并想要这样的东西:

ID  NUMber
1   10
1   11
1   12
2   30
2   31
3   11
3   12
3   13

我需要将两列之间的所有唯一整数转换为单独的行。

这就是我想要的转换外观

我什么都没尝试过,因为我什至都不知道如何调用这样的程序,所以可以得到任何帮助

Huffmanhuang 回答:两列之间的差分为两行

如果您没有数字表(强烈建议使用),则可以将临时计数表与CROSS APPLY配合使用

示例

Select A.ID,B.Number 
 From  YourTable A
 Cross Apply ( Select Top ([End]-[Start]+1) 
                      Number=[START]-1+Row_Number() Over (Order By (Select NULL)) 
                From  master..spt_values n1,master..spt_values n2 
             ) B

返回

ID  Number
1   10
1   11
1   12
2   30
2   31
3   11
3   12
3   13
,

在SQL Server中,您可以使用递归CTE:

with cte as (
      select id,[start] as number,[end] as end_number
      from t
      union all
      select id,number + 1
      from cte
      where number < end_number
     )
select id,number
from cte;

注意:如果跨度可以超过100,则需要option (maxrecursion)进行查询。

递归CTE通常比数字表慢一点。但是,我发现它们的速度比我预期的快得多。

,

--create table NewTable
--(
--ID int,--NUMBER int
--)

DECLARE @ID nvarchar(50) declare @START int declare @END int

DECLARE Cursor_Name CURSOR FOR select ID,[START],[End] from tblSequences OPEN Cursor_Name
FETCH NEXT FROM Cursor_Name INTO @ID,@START,@END WHILE @@FETCH_STATUS = 0 begin

WHILE @START<=@END begin insert into NewTable (ID,NUMBER) Values (@ID,@START) set @START = @START+1 end FETCH NEXT FROM Cursor_Name INTO @ID,@END end

CLOSE光标名称
取消分配Cursor_Name

从NewTable中选择*

本文链接:https://www.f2er.com/3158493.html

大家都在问