none
Transformar Linhas em Colunas Dinamicamente RRS feed

  • Pergunta

  • Bom dia,

    Pessoal, quem poder ajudar agradeço, queria transformar linhas em colunas dinamicamente no sqlserver.

    Tenho uma tabela assim:


    Coluna01 Coluna02
    01 pao
    02 arroz
    03 feijão
    04 carne
    04 frango

     

    01 02 03 04
    pao arroz feijão carne
          frango

    Agradeço antecipadamente,

     

    • Editado wnjesus sexta-feira, 29 de março de 2019 13:42 Correção de texto
    sexta-feira, 29 de março de 2019 13:31

Respostas

Todas as Respostas

  • Experimente o código abaixo!

    SELECT Col Coluna01, [01], [02], [03], [04], [04] FROM minhaTabela 
        UNPIVOT( Val FOR Col IN (Coluna02)) UNPVT
        PIVOT (MAX(Val) FOR Coluna01 IN ([01], [02], [03], [04], [04])) PVT


    “First do it, then do it right, then do it better.” - Addy Osmani

    sexta-feira, 29 de março de 2019 14:19
  • Deleted
    sexta-feira, 29 de março de 2019 14:55
  • Obrigado pela resposta José,

    A Coluna pode conter infinitas sequencias, por isso informo dinamicamente, o select conterá tantas quantas colunas distintas existam nela.

    sexta-feira, 29 de março de 2019 23:31
  • Uma coluna pode conter mais dados que outra..

    sexta-feira, 29 de março de 2019 23:49
  • wnjesus,

    Mas neste caso este select poderá ser tornar algo de dificil processamento para o SQL Server.

    Estas combinações de sequencias estão de alguma forma condicionadas a uma regra?

    Veja se estes exemplos postados recentemente aqui nos fóruns podem te ajudar:

    select
        Empresas,
        [0] as [0:00],
        [1] as [1:00],
        [2] as [2:00],
        [3] as [3:00],
        [4] as [4:00],
        [5] as [5:00],
        [6] as [6:00],
        [7] as [7:00],
        [8] as [8:00],
        [9] as [9:00],
        [10] as [10:00],
        [11] as [11:00],
        [12] as [12:00],
        [13] as [13:00],
        [14] as [14:00],
        [15] as [15:00],
        [16] as [16:00],
        [17] as [17:00],
        [18] as [18:00],
        [19] as [19:00],
        [20] as [20:00],
        [21] as [21:00],
        [22] as [22:00],
        [23] as [23:00]
    from
    (
        select Empresas, DATEPART(HOUR, ColunaHorario) as Hora
        from Transito
        inner join Empresas on Empresas.id = Transito.id
        where Transito.Data between @dataini and @datafim)
    ) as t
    pivot
    (
        count(Hora) for Hora in ([0], [1], [2], [3], [4], [5], [6], 
                                 [7], [8], [9], [10], [11], [12], 
                                 [13], [14], [15], [16], [17], [18],
                                 [19], [20], [21], [22], [23], [24])
    ) as p

    -- Criando a Tabela --
    CREATE TABLE #T1 
    (Hora time(0), 
     Carro char(3), 
     Apelido varchar(20))
    Go
    
    INSERT into #T1 (Hora, Carro, Apelido)
    Values ('1:00','ABC','Carro 1'),
           ('1:00','DEF','Carro 2')
    Go
    
    -- Pesquisando os dados --
    Declare @Carros varchar(200);
    
    Set @Carros= Stuff((SELECT distinct ',' +  QuoteName(Convert(varchar,Carro))
                        from #T1 for XML PATH('')),1,1,'');
    
    -- Declarando o Pivot com Query Dinâmica --
    Declare @ComandoSQL varchar(1000);
    
    Set @ComandoSQL= 'SELECT Hora, ' + @Carros + ' from #T1 ' +
                     'pivot (max(Apelido) for Carro in (' + @Carros + ')) as T2';
    
    -- Executando a Query Dinâmica --
    Exec(@ComandoSQL);
    
    -- Excluíndo a tabela --
    Drop Table #T1


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 30 de março de 2019 13:39
  • Deleted
    sábado, 30 de março de 2019 14:06