Как создать диапазон номеров чисел между двумя числами? - PullRequest
0 голосов
/ 04 мая 2020

Таким образом, у меня есть Таблица, и у меня есть Столбцы NumberMin (минимальное число), и у меня есть NumberMax (максимальное число), у меня есть много записей, я хочу выбрать все данные, и в новом столбце у меня были числа между этим числом min и числом max, как это это таблица

ID Name NumberMin NumberMax 
13 Jhon 10        14

, и когда я выбираю, я хочу быть таким

Name NumberMin NumberMax newcolum
Jhon 10        14        10
Jhon 10        14        11
Jhon 10        14        12
Jhon 10        14        13

я пробовал этот код, но не работал как

;with numcte  
AS  
(  
  SELECT NumbMin as[SEQUENCE]  
  UNION all  
  SELECT Name,NumbMin,NumbMax,[SEQUENCE] + 1 FROM Table WHERE NumbMin  <NumbMax 
)      
SELECT * FROM numcte

Ответы [ 3 ]

2 голосов
/ 04 мая 2020

Еще одним вариантом является таблица подсчета ad-ho c.

Не уверен, хотите ли вы исключить верхнее значение (14). Если это так, просто удалите +1 в Select top(...)

Пример

Select A.* 
      ,NewColumn = NumberMin+B.N-1
 From  YourTable A
 Cross Apply (
                Select Top (NumberMax-NumberMin+1) N=row_number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2
             ) B

Возвращает

enter image description here

1 голос
/ 04 мая 2020

Для этого можно использовать рекурсивный CTE.

Например:

with
x as (
  select ID, Name, NumberMin, NumberMax, NumberMin as cur from t
  UNION ALL
  select ID, Name, NumberMin, NumberMax, cur + 1
  from x
  where cur < NumberMax - 1
)
select * from x

Результат:

ID  Name  NumberMin  NumberMax  cur
--  ----  ---------  ---------  --- 
13  John         10         14   10
13  John         10         14   11
13  John         10         14   12
13  John         10         14   13

См. Пример работы на DB <> Fiddle .

1 голос
/ 04 мая 2020

Проблема вашего запроса заключается в том, что и якорная, и рекурсивная части запроса должны иметь одинаковое количество столбцов (и идентичные типы данных). Ваш якорь имеет только один столбец (numberMin), а рекурсивная часть имеет 4 столбца, поэтому ошибки запроса.

Обратите внимание:

with numcte as (
    select id, name, numberMin, numberMax, numberMin newcol from mytable
    union all
    select id, name, numberMin, numberMax, newcol + 1
    from numcte
    where newcol < numberMax - 1
)
select * from numcte

Условие where предотвращает последнее значение newcol для фактического достижения numberMax - это немного необычно, но это то, что показывает желаемый результат.

Обратите внимание, что SQL Сервер по умолчанию ограничивает количество итераций рекурсивного запроса до 100. Если вам нужно обработать больше, вам нужно добавить option (maxrecursion 0) в конце запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...