none
uma coluna virar 3 colunas

    Question

  • bom dia pessoal, estou com uma tabela que possui apenas uma coluna, porem queria desmembrar queria transformar ela em tres colunas, pois os dados ficariam melhores para consulta, a tabela é a seguinte,

    nome

    valor1

    valor2

    queria tentar fazer ficar assim

    nome            valor1        valor2

    cursor não ta dando certo, se alguem puder ajudar fico muito grato,

     

    Tuesday, June 28, 2011 3:28 PM

Answers

  • Segue o exemplo para uma tabela de 3 colunas:

    SET NOCOUNT ON

     

    -- Simulação da sua tabela oficial

    Create Table #TabelaOficial (Coluna1 VarChar(10))

    Insert Into #TabelaOficial Values

    ('010101') , ('12.50'), ('12.50'),

    ('010102') , ('20.50'), ('22.50'),

    ('0101025'), ('23.54'), ('50.54'),

    ('0101012'), ('12.58'), ('12.58')

     

    -- Cria uma tabela cópia com um Id auto-incremental

    Create Table #TabelaCopia (Coluna1 VarChar(10), Id int Identity)

    Insert Into #TabelaCopia (Coluna1) Select Coluna1 From #TabelaOficial

     

    -- Cria a tabela final jogando para a Coluna1 somente os registros cujo Id é ímpar

    Create Table #TabelaFinal (Id int, Coluna1 int, Coluna2 Float, Coluna3 Float)

     

    /* PRIMEIRA COLUNA */

    Declare @i int = 1

     

    while @i <= (Select COUNT(*) From #TabelaCopia)

    begin

      Insert Into #TabelaFinal (Id, Coluna1) Select Id, Coluna1 From #TabelaCopia Where (Id = @i)

      Set @i += 3

    end

     

    /* SEGUNDA COLUNA */

    Update TF Set Coluna2 = TC.Coluna1 From #TabelaFinal TF Join #TabelaCopia TC on (TC.Id = TF.Id + 1)

     

    /* TERCEIRA COLUNA */

    Update TF Set Coluna3 = TC.Coluna1 From #TabelaFinal TF Join #TabelaCopia TC on (TC.Id = TF.Id + 2)

     

    -- Verifica o resultado

    Select * From #TabelaFinal

     

    SET NOCOUNT OFF


    Roberson Ferreira - Database Developer

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marked as answer by thisderb Saturday, July 02, 2011 7:51 PM
    Thursday, June 30, 2011 10:23 PM

All replies

  • Boa Tarde,

    Por favor dê mais detalhes como o SQL Server utilizado, os critérios para separar as colunas e se possível alguns exemplos. Caso possa postar as instruções de CREATE e INSERT para reproduzirmos a necessidade seria de grande valia.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    Tuesday, June 28, 2011 4:07 PM
  • Boa tarde!

    Thisderb,

     

    Se eu consegui entender o que você quer, acho que esse código irá ajudar:

    declare @tabela as table (nome varchar(20) null)
    
    insert into @tabela values ('valor1')
    insert into @tabela values ('valor2')
    
    select * from @tabela
    
    select
      'Nome' as Nome,
      [valor1] as Valores,
      [valor2] as Valores
    from
      (select nome from @tabela) as ST
      pivot
      (max(nome)
       FOR nome in ([valor1], [valor2])
      ) as PVT
    

    Qualquer dúvida, você pode encontrar mais sobre o PIVOT neste link:

    http://msdn.microsoft.com/pt-br/library/ms177410.aspx

    Att,


    Fredy Esmeraldo
    Microsoft MCP, MCTS SQL Server 2008 Implementation and Maintenance
    Visite o meu blog: http://fredyesmeraldo.wordpress.com
    Me siga no twitter: @fredyesmeraldo
    LinkedIN: Fredy Esmeraldo
    **Ajude a melhorar o sistema de busca do fórum.Marque a(s) resposta(s) que foram úteis**
    **Se esta resposta solucionou a questão, então, por favor, marque-a como resposta.**
    Tuesday, June 28, 2011 6:06 PM
  • O CODIGO ESTA CERTO POREM AS TABELA NÃO FICA PREENCHIDA COM OS  VALORES É ISSO MESMO É PIVOT A SOLUÇÃO SO Q LENDO O CONTEUDO AINDA NÃO CONSEGUI A SOLUÇÃO. EXEMPLO

     

    010101
    12,50
    010102
    20,50
    0101025
    23,54
    0101012
    12,58
    NULL

     

    ESSES É OS VALORES SÓ QUE ESSA ESTA COM DOIS VALORES.

    O CODIGO FICARA EM UMA COLUNA E O PREÇO EM OUTRA A OUTRA TABELA TEM TRES COLUNAS,

     

    GRATO

    Tuesday, June 28, 2011 9:15 PM
  • Fera, como é que você sabe o que é o que nestes registros que você passou? O que é "nome", o que é "valor 1" e o que é "valor 2"? Se essa tabela só tem uma coluna, você tem que nos dizer como quer que o SQL interprete quem é quem.

    010101 -> Isso seria "nome"? E sempre será um número inteiro com 6 caracteres?
    12,50 -> Isso seria "valor 1"? E pode acontecer então de um "nome" não ter "valor 2"?
    010102
    20,50
    0101025
    23,54
    0101012
    12,58
    NULL

    Roberson Ferreira - Database Developer

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    Tuesday, June 28, 2011 10:36 PM
  • Fera, como é que você sabe o que é o que nestes registros que você passou? O que é "nome", o que é "valor 1" e o que é "valor 2"? Se essa tabela só tem uma coluna, você tem que nos dizer como quer que o SQL interprete quem é quem.

    010101 -> Isso seria "nome"? E sempre será um número inteiro com 6 caracteres?
    12,50 -> Isso seria "valor 1"? E pode acontecer então de um "nome" não ter "valor 2"?
    010102
    20,50
    0101025
    23,54
    0101012
    12,58
    NULL

     

     

    O SQL SO PRECISA COLOCAR A PRIMEIRA LINHA EM UMA COLUNA E A SEGUNDA LINHA EM OUTRA COLUNA, A TERCEIRA LINHA NA COLUNA 1, A QUARTA LINHA NA COLUNA 2, A QUINTA LINHA NA COLUNA 1 , A SEXTA LINHA NA COLUNA DOIS E ASSIM SUCESSIVAMENTE.

    OBS TENHO DUAS TABELAS UMA COM DOIS VALORES OU SEJA UM PEDAÇO DA QUE ESTA ACIMA E UMA QUE TEM TRES VALORES COM UM CODIGO, VALOR1 E VALOR2.

     

     

    GRATO

    Wednesday, June 29, 2011 10:40 AM
  • Cara, vou considerar então o seguinte cenário: você só tem uma coluna na tabela e nessa coluna as informações estão sempre da seguinte maneira:

    • 1º registro: número que deveria estar na Coluna1;
    • 2º registro: valor que deveria estar na Coluna2;
    • 3º registro: número que deveria estar na Coluna1;
    • 4º registro: valor que deveria estar na Coluna2;
    • 5º registro: número que deveria estar na Coluna1;
    • 6º registro: valor que deveria estar na Coluna2. (E assim por diante.)

    Para isso, precisaremos de uma outra coluna. Então teremos que criar uma tabela que servirá como "ponte", para chegarmos ao resultado final. Segue o script:

    -- Simulação da sua tabela oficial

    Create Table #TabelaOficial (Coluna1 VarChar(10))

    Insert Into #TabelaOficial Values ('010101'), ('12.50'), ('010102'), ('20.50'), ('0101025'), ('23.54'), ('0101012'), ('12.58')

     

    -- Cria uma tabela cópia com um Id auto-incremental

    Create Table #TabelaCopia (Coluna1 VarChar(10), Id int Identity)

    Insert Into #TabelaCopia (Coluna1) Select Coluna1 From #TabelaOficial

     

    -- Cria a tabela final jogando para a Coluna1 somente os registros cujo Id é ímpar

    Create Table #TabelaFinal (Id int, Coluna1 int, Coluna2 Float)

    Insert Into #TabelaFinal (Id, Coluna1) Select Id, Coluna1 From #TabelaCopia Where (Id % 2) <> 0

     

    -- Atualiza a Coluna2 pegando, para cada Id, o registro imediatamente posterior a ele (que na verdade é o valor)

    Update TF Set Coluna2 = TC.Coluna1 From #TabelaFinal TF Join #TabelaCopia TC on (TC.Id = TF.Id + 1)

     

    -- Verifica o resultado

    Select * From #TabelaFinal


    Roberson Ferreira - Database Developer

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    Wednesday, June 29, 2011 2:30 PM
  • parceiro esse exemplo da certinho mas como disse tenho duas tabelas uma com duas colunas e outra com tres exemplos,

     

    010101

    12,50

    12,50

    010102

    20,50

    22,50

    0101025

    23,54

    50,54

    0101012

    12,58

    12,58

    NULL

     

     

     

     

    essa seria a tabela que tem que ser mudada preciso que o codigo fica em uma coluna, o valor1 em outra coluna e o valor2 em outra coluna, o outro codigo na linha2 o valor1 na linha 2 coluna2 e o valor2 na linha 2 coluna3, e assim sucessivamente igual no caso que o ROBERSON fez porem com tres colunas

    Thursday, June 30, 2011 9:24 PM
  • Cara, mas se o que eu fiz lhe atende (para uma tabela com 2 colunas), é só você alterar para uma tabela com 3 colunas.
    Roberson Ferreira - Database Developer

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    Thursday, June 30, 2011 10:02 PM
  • Segue o exemplo para uma tabela de 3 colunas:

    SET NOCOUNT ON

     

    -- Simulação da sua tabela oficial

    Create Table #TabelaOficial (Coluna1 VarChar(10))

    Insert Into #TabelaOficial Values

    ('010101') , ('12.50'), ('12.50'),

    ('010102') , ('20.50'), ('22.50'),

    ('0101025'), ('23.54'), ('50.54'),

    ('0101012'), ('12.58'), ('12.58')

     

    -- Cria uma tabela cópia com um Id auto-incremental

    Create Table #TabelaCopia (Coluna1 VarChar(10), Id int Identity)

    Insert Into #TabelaCopia (Coluna1) Select Coluna1 From #TabelaOficial

     

    -- Cria a tabela final jogando para a Coluna1 somente os registros cujo Id é ímpar

    Create Table #TabelaFinal (Id int, Coluna1 int, Coluna2 Float, Coluna3 Float)

     

    /* PRIMEIRA COLUNA */

    Declare @i int = 1

     

    while @i <= (Select COUNT(*) From #TabelaCopia)

    begin

      Insert Into #TabelaFinal (Id, Coluna1) Select Id, Coluna1 From #TabelaCopia Where (Id = @i)

      Set @i += 3

    end

     

    /* SEGUNDA COLUNA */

    Update TF Set Coluna2 = TC.Coluna1 From #TabelaFinal TF Join #TabelaCopia TC on (TC.Id = TF.Id + 1)

     

    /* TERCEIRA COLUNA */

    Update TF Set Coluna3 = TC.Coluna1 From #TabelaFinal TF Join #TabelaCopia TC on (TC.Id = TF.Id + 2)

     

    -- Verifica o resultado

    Select * From #TabelaFinal

     

    SET NOCOUNT OFF


    Roberson Ferreira - Database Developer

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marked as answer by thisderb Saturday, July 02, 2011 7:51 PM
    Thursday, June 30, 2011 10:23 PM
  • certinho muito obrigado.

     

    Saturday, July 02, 2011 7:51 PM