none
COMO REPETIR REGISTROS EM SQL? RRS feed

  • Pergunta

  • Olá,

    Numa tabela Produtos com QtdeEstoque, como fazer uma sql que retorne n vezes o mesmo produto, sendo n =QtdeEstoque ?

    PHB
    quinta-feira, 16 de abril de 2009 18:25

Respostas

  • Use uma tabela auxiliar...

    Por ex:


    declare @Tab table (Codigo Int, Produto VarChar(30), Estoque Int)
    
    insert into @Tab values(1,'Motor BMW', 5)
    insert into @Tab values(2,'Trator Agrale', 3);
    
    WITH Seq
    AS(SELECT 1 AS ID
        UNION ALL
       SELECT ID + 1
         FROM Seq
        WHERE ID < 100)
    
    SELECT t.* FROM @Tab t
    inner join Seq
      on Seq.ID between 0 and t.Estoque
    order by Codigo
    OPTION (MAXRECURSION 0);

    Fabiano Neves Amorim - MCTS / MCP - SQLServer - http://fabianosqlserver.spaces.live.com/
    • Marcado como Resposta PabloHB quinta-feira, 16 de abril de 2009 20:49
    quinta-feira, 16 de abril de 2009 20:24

Todas as Respostas

  • Olá,

    Não entendi bem.

    Você está querendo agrupar os dados?

    tipo

    açucar 8
    arroz   9
    ...

    Abraços
    Demétrio Silva
    quinta-feira, 16 de abril de 2009 19:59
  • Não, gostaria que num cadastro

    Código | Produto           | Estoque
    1         | Motor BMW      | 5
    2         | Trator Agrale   | 3

    ...uma query retornasse

    Motor BMW
    Motor BMW
    Motor BMW
    Motor BMW
    Motor BMW
    Trator Agrale
    Trator Agrale
    Trator Agrale


    PHB
    quinta-feira, 16 de abril de 2009 20:02
  • Olá,

    Só por curiosidade, você quer fazer isso pra que?

    Abraços
    Demétrio Silva
    quinta-feira, 16 de abril de 2009 20:04
  • Para imprimir etiquetas num programa especifico de uma impressora de etiquetas que aceita sql por uma dll
    PHB
    quinta-feira, 16 de abril de 2009 20:17
  • Use uma tabela auxiliar...

    Por ex:


    declare @Tab table (Codigo Int, Produto VarChar(30), Estoque Int)
    
    insert into @Tab values(1,'Motor BMW', 5)
    insert into @Tab values(2,'Trator Agrale', 3);
    
    WITH Seq
    AS(SELECT 1 AS ID
        UNION ALL
       SELECT ID + 1
         FROM Seq
        WHERE ID < 100)
    
    SELECT t.* FROM @Tab t
    inner join Seq
      on Seq.ID between 0 and t.Estoque
    order by Codigo
    OPTION (MAXRECURSION 0);

    Fabiano Neves Amorim - MCTS / MCP - SQLServer - http://fabianosqlserver.spaces.live.com/
    • Marcado como Resposta PabloHB quinta-feira, 16 de abril de 2009 20:49
    quinta-feira, 16 de abril de 2009 20:24
  • Oi Fabiano,

    Eu que adoro as CTEs nunca tinha pensado por esse lado. Interessante...
    Normalmente eu faria assim

    declare @Tab table (Codigo Int, Produto VarChar(30), Estoque Int)
    
    insert into @Tab values(1,'Motor BMW', 5)
    insert into @Tab values(2,'Trator Agrale', 3)
    
    ;WITH Nums (Num) As (
    SELECT 0 UNION ALL SELECT 1 UNION ALL
    SELECT 2 UNION ALL SELECT 3 UNION ALL
    SELECT 4 UNION ALL SELECT 5 UNION ALL
    SELECT 6 UNION ALL SELECT 7 UNION ALL
    SELECT 8 UNION ALL SELECT 9)
    
    SELECT Codigo, Produto, Estoque
    FROM Nums As N1
    CROSS JOIN Nums As N2
    INNER JOIN @Tab AS T ON Estoque > (N1.Num * 10) + N2.Num

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Como realizar cálculos com horas no SQL Server – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!532.entry


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 16 de abril de 2009 20:46
  • Fabiano,

    parabéns .. sua solução foi sagaz.....
    a primeira coisa que pensaria era o cross...

    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    quinta-feira, 16 de abril de 2009 20:49
  • Pois é Maia, uma vez, caiu na minha mão um script de conversão onde o desenvolvedor havia feito um cursor para transformar algo tipo assim:

    Parcela_Inicial Parcela_Final
    1                    60
    30                  52

    Em:

    Parcela_Inicial Parcela_Final
    1                    60
    1                    60
    ...repetisse o número de vezes do valor gravado na columa Parcela_Final(60)... e depois partisse para o próximo registro.

    Dai troquei o cursor por um código utilizando a mesma lógica acima... o ganho foi muito alto...

    Fabiano Neves Amorim - MCTS / MCP - SQLServer - http://fabianosqlserver.spaces.live.com/
    quinta-feira, 16 de abril de 2009 20:55