2009-02-13 12 views
7

Digamos que tengo la siguiente tabla en MS SQL 2000cómo dividir SQL Int Valor en varias filas

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

que necesito para mostrar varias filas sobre la base de la cantidad, así que necesito el siguiente resultado:

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

¿Alguna idea de cómo lograr esto?

Respuesta

3

Esto funciona bien, no hay necesidad de ningún cursores en este caso. También es posible colgar algo sin una tabla numérica.

Nota Si fuera por este tipo de solución, mantendría una tabla numérica y no volvería a crearla cada vez que ejecutara la consulta.

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

De hecho, si @i se estableció al máximo de la cantidad de #splitme, hubiera sido perfecto. De todos modos +1! – Learning

+0

select @i = max (quantity) from #splitme .... –

+0

por cierto ... quien sea que haya votado negativamente, ¿puede explicar por qué? –

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 

Por cierto, los cursores son generalmente mal considerado. Así que recomendaré algo así como algo así, y agradezco a todos de antemano por sus llamas;) (Pero debería funcionar)