2009-02-13 36 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 

順便說下,遊標是一般認爲是邪惡的。所以我都會推薦反對這樣的事情,並且預先感謝所有人的火焰;)(但它應該工作)