Как я могу генерировать строки в таблице SQL, чтобы разбить диапазон на отдельные строки - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть данные с информацией, аналогичной приведенной ниже:

Customer  Start   End
AAA        100    399 
BBB        400    899
CCC        900    999  
AAA        1000   1199

Мне нужно, чтобы это было 2 столбца, 1 с именем клиента и другой с каждым значением в пределах диапазона. И.Е.

Customer    Number
AAA           100
AAA           101
AAA           102   ETC

Как это можно написать на SQL?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Если у вас уже есть таблица чисел, используйте ее. Если нет, вы можете создать таблицу чисел на лету, используя cte.

Сначала создайте и заполните образец таблицы ( Пожалуйста, сохраните этот шаг в ваших будущих вопросах):

DECLARE @T AS TABLE
(
    Customer char(3),
    Start int,
    [End] int
);

INSERT INTO @T(Customer, Start, [End]) VALUES
('AAA', 100, 399), 
('BBB', 400, 899),
('CCC', 900, 999),  
('AAA', 1000, 1199);

Затем используйте cte для генерации нужных вам чисел

WITH Tally(n) AS
(
    SELECT TOP(select max([End]) from @T) ROW_NUMBER() OVER(ORDER BY @@SPID) 
    FROM sys.objects
)

Наконец, выберите из таблицы, присоединенной к cte:

SELECT Customer, n
FROM @T
JOIN Tally 
    ON n >= Start
    AND n <= [End]
ORDER BY Customer, n    
0 голосов
/ 05 ноября 2018

Лучший подход, который я бы порекомендовал, - это пойти на рекурсию с CTE. Пожалуйста, найдите следующий фрагмент кода, чтобы сделать это.

declare @source table (customer varchar(15), rangeStart int, rangeEnd int)

insert into @source (customer, rangeStart, rangeEnd)
select 'AAA', 100, 399
union
select 'BBB', 400, 899
union
select 'CCC', 900, 999
union
select 'AAA', 1000, 1199


select * from @source

; with results as (
    select Customer, rangeStart, rangeEnd, rangeNumber = rangeStart
        from @source
    union all
    select Customer, rangeStart, rangeEnd, rangeNumber + 1
        from results
        where rangeNumber <= rangeEnd

)

select * 
    from results 
    order by rangeNumber
    option (MAXRECURSION 20000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...