2016-07-26 2 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

I Вы хотите вернуть пробелы между значениями из столбцов 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

Вы можете использовать КТР и Перекодировка в 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 
Смежные вопросы