PIVOT – TSQL – Transformar linhas em colunas

Olha o que o usuário me aprontou…

Me enviou uma planilha com cadastro de novos funcionários para importar para a base de dados.

Porém, a formatação do arquivo não me permite uma importação trivial e isso me fez aplicar o operador PIVOT, para transformar linhas em colunas.

Select * From _FUNCIONARIOS

pivot_1

Logo que vi o arquivo pensei em usar PIVOT, onde a estrutura ficará coluna1 = NOME, coluna2 = MATRICULA e os valores de cada registro.

Para controle de sequência e ordem de NOME / MATRICULA, adicionei uma coluna id_Controle com valor sequencial.

If not Exists (Select *
                 From Sys.columns
                Where Name = 'id_Controle'
                  And Object_Id = Object_Id('_FUNCIONARIOS'))
Begin
		Alter Table _FUNCIONARIOS
		  Add id_Controle int identity Not Null
  End;
Go

Select * From _FUNCIONARIOS

pivot_2

Será necessário usar a função de classificação ROW_NUMBER particionado pela coluna 1 e ordenado pela coluna id_Controle, para retornar todos os registros e a quantidade de colunas que teremos na estrutura final do PIVOT.

Select [NOME], [MATRICULA]
  From
(Select column1,
        column2,
        row_number() over(partition by column1 order by id_Controle) controle
   From _FUNCIONARIOS
   ) as func_Pivot
PIVOT
(
   max(column2)
    For column1 in ([NOME],[MATRICULA])
) AS Pivot_Estrutura
Order by Pivot_Estrutura.NOME;

pivot_3

Agora é só fazer o insert na tabela tb_Funcionario

Insert tb_Funcionario (nm_Funcionario,nu_Matricula)
Select [NOME], [MATRICULA]
  From
(Select column1,
        column2,
        row_number() over(partition by column1 order by id_Controle) controle
   From _FUNCIONARIOS
   ) as func_Pivot
PIVOT
(
   max(column2)
    For column1 in ([NOME],[MATRICULA])
) AS Pivot_Estrutura
Order by Pivot_Estrutura.NOME;

Select * From tb_Funcionario

pivot_4

Adicionar comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *