2016-07-26 64 views
0

我有这样的代码,发现2个数字之间的差距之间的范围内:打印2号

;WITH 
cte AS (
SELECT 
    BSEG_BELNR, 
    RowNum = ROW_NUMBER() OVER (ORDER BY BSEG_BELNR) 
FROM dbo.QLIK_JOURNAL GROUP BY BSEG_BELNR), 
cte2 AS (
SELECT *, DENSE_RANK() OVER (ORDER BY BSEG_BELNR - RowNum) AS Series 
FROM cte), 
cte3 AS (
SELECT *, COUNT(*) OVER (PARTITION BY Series) AS SCount 
FROM cte2), 
cte4 AS (
SELECT 
    MinID = MIN(BSEG_BELNR), 
    MaxID = MAX(BSEG_BELNR), 
    Series 
FROM cte3 
GROUP BY Series) 
SELECT a.MaxID,b.MinID 
FROM cte4 a 
INNER JOIN cte4 b 
    ON a.Series+1 = b.Series 
    ORDER BY a.MaxID 

这个代码给出了2列,但我需要打印不同我的意思是不是差距开始和结束。

MaxID   MinID  
----------------------- 
0000015010 0000015012 
0000015018 0000015020 
0000015020 0000015022 
0000015041 0000015043 
0000015062 0000015065 
........  ........ 

,我想在

之间

Gap 
--------- 
0000015011 
0000015019 
0000015021 
0000015042 
0000015063 
0000015064 
我可怎么办,在SQL SERVER打印的数字

回答

0

我你想从列MaxID和MinID值之间返回的空白,试试这个:

declare @res table (ID int, varID varchar(10)) 
declare @cr_MIN int 
declare @cr_MAX int 


declare cr cursor as 
select cast(MinID as int) + 1 
    ,cast(MaxID as int) 
from ... 

open cr 
fetch next from cr 
into @cr_MIN, @cr_MAX 

while @@FETCH_STATUS <> 0 
begin 

    while @cr_MIN < @cr_MAX 
    begin 
     insert into @res (ID, varID) 
     select @cr_MIN, STUFF(@cr_MIN,1,0,'00000') 
     set @cr_MIN + 1 
    end 

    fetch next from cr 
    into @cr_MIN, @cr_MA 
end 
close cr 
deallocate cr 

select * from @res 
1

您可以使用CTE和皈依到int

;WITH cte AS (
SELECT MIN(CAST(MaxID as int)) as Mi, 
     MAX(CAST(MinID as int)) as Ma 
FROM YourResultSet c 
UNION ALL 
SELECT Mi + 1, 
     Ma 
FROM cte 
WHERE Mi < Ma 
) 

SELECT STUFF(c.Mi,1,0,'00000') 
FROM cte c 
INNER JOIN YourResultSet y 
    ON c.Mi > CAST(MaxID as int) and c.Mi < CAST(MinID as int) 

输出:

0000015011 
0000015019 
0000015021 
0000015042 
0000015063 
0000015064