Как разделить Sql Int Value на несколько строк - PullRequest
7 голосов
/ 13 февраля 2009

Допустим, у меня есть следующая таблица в MS SQL 2000

Id | description | quantity |
-------------------------------
1    my desc          3
2    desc 2           2

Мне нужно отобразить несколько строк в зависимости от количества, поэтому мне нужно следующее:

Id | description | quantity |
-----------------------------
1    my desc          1
1    my desc          1
1    my desc          1
2    desc 2           1
2    desc 2           1

Есть идеи, как этого добиться?

Ответы [ 2 ]

3 голосов
/ 13 февраля 2009

Это работает просто отлично, никаких курсоров на этом не нужно. Может быть возможно и что-то вывести без таблицы чисел.

Примечание Если бы я искал такое решение, я бы сохранял таблицу чисел и не создавал ее заново каждый раз, когда выполнял запрос.

create table #splitme (Id int, description varchar(255), quantity int) 
insert #splitme values (1    ,'my desc',          3)
insert #splitme values (2    ,'desc 2',           2)

create table #numbers (num int identity primary key) 
declare @i int 
select @i = max(quantity) from #splitme
while @i > 0
begin   
    insert #numbers default values 
    set @i = @i - 1 
end

select Id, description, 1 from #splitme 
join #numbers on num <= quantity
0 голосов
/ 13 февраля 2009
DECLARE @Id INT
DECLARE @Description VARCHAR(32)
DECLARE @Quantity INT
DECLARE @Results TABLE (Id INT, [description] VARCHAR(32), quantity INT)
DECLARE MyCursor CURSOR FOR
    SELECT Id, [description], quantity
    FROM
        MyTable

OPEN MyCursor

FETCH NEXT FROM MyCursor INTO @Id, @Description, @Quantity

WHILE @@FETCH_STATUS = 0
BEGIN
    WHILE @Quantity > 0
    BEGIN
        INSERT INTO @Results (
            Id,
            [description],
            quantity
        ) VALUES (
            @Id,
            @Description,
            1
        )
        SET @Quantity = @Quantity - 1
    END
    FETCH NEXT FROM MyCursor INTO @Id, @Description, @Quantity
END

CLOSE MyCursor
DEALLOCATE MyCursor

SELECT *
FROM
    @Results

Кстати, курсоры обычно считаются злом. Так что я оба рекомендую против чего-то подобного, и заранее всех благодарю за их пламя;) (Но это должно сработать)

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