2009-02-13 6 views
7

Disons que je le tableau suivant dans MS SQL 2000Comment diviser Sql Int valeur dans plusieurs lignes

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

je dois afficher plusieurs lignes en fonction de la quantité, donc je besoin de la sortie suivante:

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

Des idées pour y parvenir?

Répondre

3

Cela fonctionne très bien, pas besoin de curseurs sur celui-ci. Il peut être possible de faucher quelque chose sans une table numérique.

Note Si vous utilisez ce type de solution, je conserverais une table de nombres et je ne la recréerais pas chaque fois que j'exécuterais la requête.

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

Certes, si @i était réglé sur la quantité maximale de #splitme, cela aurait été parfait. Quoi qu'il en soit, +1! – Learning

+0

sélectionnez @i = max (quantité) à partir de #splitme .... –

+0

btw .. celui qui downvoted cela pouvez-vous expliquer pourquoi? –

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 

Par ailleurs, les curseurs sont généralement considéré comme le mal. Donc, je vais recommander à la fois contre quelque chose comme ça, et remercier tout le monde à l'avance pour leurs flammes;) (Mais cela devrait fonctionner)

Questions connexes