如何将Sql Int值拆分为多行

7
假设我在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

有什么想法可以实现这个吗?
3个回答

4

这个工作非常好,不需要任何游标。也许可以不用数字表格就可以弄出一些东西。

注意,如果选择这种解决方案,我会保留一个数字表,并且不会在每次运行查询时重新创建它。

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

1
诚然,如果@i从#splitme设置为数量的最大值,那就完美了。无论如何+1! - Learning
我的意思是在 while 循环中使用 max 函数,这样你就不会循环 10000 次(如果其中一个 Quantity 是 10001 的话该怎么办)。选择最大值将消除该情况。 - Learning

1

如果有人正在寻找基于CTE的解决方案,这里有一个:

create table test_splitme (Id int, description varchar(255), quantity int) 

insert test_splitme values (1    ,'my desc',          3)

insert test_splitme values (2    ,'desc 2',           2)
;

--TSQL solution

with splitcte as(
select Id,description, 1 as quantity, quantity as orig_quantity, 1 as cnt
 
from test_splitme

union all 

select Id, description, quantity, orig_quantity,cnt+1

from splitcte

where cnt < orig_quantity
)

select  Id, description, quantity

from splitcte

order by 1

优雅的解决方案! - Stringeater

1
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

顺便提一下,游标通常被认为是邪恶的。因此,我不建议使用这种方法,并提前感谢大家发表的评论(但它应该能够工作)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接