2009-02-13 40 views
7

可以说,我下表在MS SQL 2000如何拆分的Sql诠释价值为多行

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

这工作得很好,不需要任何光标在这一个。有可能在没有数字表格的情况下出现问题。

注意如果要采用这种解决方案我会保留一个数字表,而不是每次运行查询时重新创建它。

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

不可否认,如果@i被设置为来自#splitme的最大数量,它将会是完美的。无论如何+1! – Learning 2009-02-13 04:58:13

0
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 

顺便说下,游标是一般认为是邪恶的。所以我都会推荐反对这样的事情,并且预先感谢所有人的火焰;)(但它应该工作)