none
Multiplicar linhas de uma tabela de acordo com o valor de uma coluna da mesma linha. RRS feed

  • Pergunta

  • Boa noite!

    Gostaria de montar um Consulta que me retorne o seguinte valores:

    Por Ex:

    Tabela NomeTabela

    Código Total de Pontos Data
    33000 3 01/01/2014
    33001 4 02/01/2014

    Me retornar da seguinte maneira

    Consulta

    Código Total de Pontos Data
    33000 3 01/01/2014
    33000 2 01/01/2014
    33000 1 01/01/2014
    33001 4 02/01/2014
    33001 3 02/01/2014
    33001 2 02/01/2014
    33001 1 02/01/2014

    tenho uma aqui que sai o resultado parecido, porem tenho que acrescentar cada um union all select para cada lilha duplicada e cada Ponto da tabela pode ter o valor de até 999 e ficaria invavel fazer 999 union all select.

    segue minha consulta

    SELECT        código, [Total de Pontos], data
    FROM            NomeTabela
    UNION ALL
    SELECT        código, [Total de Pontos] - 1 , data
    FROM            NomeTabela
    WHERE        ([Total de Pontos] - 1 > 0)
    UNION ALL
    SELECT        código, [Total de Pontos] - 2, data
    FROM            NomeTabela
    WHERE        ([Total de Pontos] - 2 > 0)

    se alguém tiver uma maneira mais fácil de fazer essa consulta por favor....

    obrigado!



    sexta-feira, 28 de fevereiro de 2014 22:43

Respostas

Todas as Respostas

  • Deleted
    • Marcado como Resposta Cleitonti sábado, 1 de março de 2014 16:09
    sexta-feira, 28 de fevereiro de 2014 22:58
  • Uma abordagem é criar tabela auxiliar de números, contendo os valores 999 a 1, e montar cross join com a tabela de pontuação.

    Algo assim:

    -- código 1 v3
    set NOCOUNT ON;

    -- cria tabela auxiliar de números
    if Object_ID('tempdb..#Numeros','U') is not null drop table #Numeros; create table #Numeros (Num int primary key); declare @I int; set @I= 999; while @I > 0 begin insert into #Numeros values (@I); set @I= @I - 1; end; go --
    SELECT T.Código, N.Num as Pontos, convert(char(10), T.Data, 103) as Data from NomeTabela as T cross join #Numeros as N where Num <= T.Pontos
    order by T.Código asc, Pontos desc; go --drop table #Numeros;
     
    Para testar:
    -- tamborete
    set NOCOUNT ON;
    
    create table NomeTabela (Código int primary key, Pontos int, Data date);
    set dateformat dmy;
    insert into NomeTabela values 
      (33000, 3, '1/1/2014'), (33001, 4, '2/1/2014');
    go



        José Diz     Belo Horizonte, MG - Brasil
    (Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)


    José,

    Cara não entendi o porque você criou um laço para popular a sua table, se poderiamos fazer uso do Go, com a coluna Num utilizando o Identity, utilizando a claúsula default Values.

    Veja este exemplo:

    create table #Numeros 
    (Num int primary key Identity(1,1);
    Go
    
    Insert into #Numeros default values
    Go 999

    Evitar o uso de Laço e Cursores é uma boa prática.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sábado, 1 de março de 2014 14:18
  • Deleted
    sábado, 1 de março de 2014 14:55
  • José,

    Perfeito, sim realmente é um laço, mesmo que interno é realizado de uma única vez.

    Eu conheço este método do Itzik. Mas foi realmente um comentário.

    Então, eu particularmente prefiro uma table auxiliar até mesmo temporária.



    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sábado, 1 de março de 2014 15:22
  • Ok, Obrigado pessoal, vcs me ajudaram muito deu certo aqui, ficou como eu queria.

    Porem tenho outra duvida, na mesma consulta, preciso fazer com que um coluna  me retorno valores aleatórios menores que o original totalizando no valor original com por ex.

    Tabela NomeTabela

    Código Total de Pontos Data Valor1
    33000 3 01/01/2014   10
    33001 5 02/01/2014 
      20

    Me retornar da seguinte maneira

    Consulta

    Código Total de Pontos Data Valor1
    33000 3 01/01/2014   2
    33000 2 01/01/2014   5
    33000 1 01/01/2014   3
    33001 5 02/01/2014   5
    33001 4 02/01/2014   4
    33001 3 02/01/2014   0
    33001 2 02/01/2014   8
    33001 1 02/01/2014   3

    Aguem tem alguma ideia?


    sábado, 1 de março de 2014 15:55
  • Deleted
    sábado, 1 de março de 2014 19:59
  • Deleted
    sábado, 1 de março de 2014 20:00
  • Muito Obrigado pela ajuda, porem não estou conseguindo implantar esse código em minha consulta pois gera um erro, Obs: estou tentando implantar esse código na consulta de um banco em Access através do Visual Studio 10, porem o criador de consulta sql é muito limitado, será que vcs podem me ajudar, O "cross join" consegui implantar apenas o "Rand()" não consegui.
    • Editado Cleitonti sábado, 8 de março de 2014 16:48
    sábado, 8 de março de 2014 16:30
  • Deleted
    sábado, 8 de março de 2014 21:30
  • Cleiton, avalie o uso da função Rnd(), do Access.

         José Diz     Belo Horizonte, MG - Brasil
    (Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)


    José, Como faço isso? sou iniciante e ainda não sei muita coisa, seque minha sql.

    INSERT INTO TempCigarrinha
                             (Coletor, Data, Fazenda, Zona, Talhao, [Total de Pontos], [Sit da Palha], [Ninfas Vivas], [Adultos Vivos], [Ninfas parasitada], [Adultos parasitado], [N Lev])
    SELECT        T.Coletor, T.Data, T.Fazenda, T.Zona, T.Talhao, N.Num AS [Total de Pontos], T.[Sit da Palha], T.[Ninfas Vivas], T.[Adultos Vivos], T.[Ninfas parasitada],
                             T.[Adultos parasitado], T.[N Lev]
    FROM            (Cigarrinha T INNER JOIN
                             Numeros N ON T.[Total de Pontos] >= N.Num)

    sábado, 8 de março de 2014 22:31
  • Deleted
    domingo, 9 de março de 2014 11:04
  • Ok, muito obrigado pela ajuda, até consegui usar o RND() porem ele só me gera numeros aleatórios que o valor maximo é o que consta em "T.Valor1", mais na verdade eu quero que gere os números aleatórios porem que somando as linhas seja o mesmo valor do "T.Valor1" original.

    Original
    Código Pontos Data Valor1
    33000 3 01/01/2014   10
    Resultado
    Código Pontos Data Valor1
    33000 1 01/01/2014       

    33000 2 01/01/2014 5
    33000 3 01/01/2014 3


                                   Soma Valor1 = 10         

    domingo, 9 de março de 2014 20:46