No SQL Server, existem dois operadores relacionais que permitem converter linhas em colunas e colunas em linhas: PIVOT e UNPIVOT. Esses operadores podem ser úteis quando você precisa transformar seus dados para fins de relatórios ou análises.
Convertendo Linhas em Colunas – PIVOT
O operador PIVOT no SQL Server permite que você gire os valores únicos de uma coluna especificada de várias linhas em valores de coluna múltiplos na saída. Isso efetivamente transforma uma tabela ao girá-la. A sintaxe básica para o operador PIVOT é a seguinte:
SELECT <<NomesDasColunas>>
FROM <<NomeDaTabela>>
PIVOT (
FunçãoAgregada (<<ColunaASerAgregada>>)
PARA ColunaPivot EM (<<ValoresDaColunaPivot>>)
) AS <<Alias>>
Por exemplo, vamos supor que temos uma tabela chamada “ExemploPivot” com informações de vendas para diferentes países e anos. Podemos usar o operador PIVOT para converter os valores das linhas em valores de coluna:
SELECT [País], [2005], [2006], [2007], [2008]
FROM [dbo].[ExemploPivot]
PIVOT (
SUM(ValorVenda)
PARA [Ano] EM ([2005], [2006], [2007], [2008])
) AS P
Isso nos dará um conjunto de resultados com os nomes dos países como linhas e os valores de vendas para cada ano como colunas.
Trazendo Dinamismo para o PIVOT
Se você espera valores adicionais para a coluna pivot no futuro, ainda é possível usar o operador PIVOT. Os valores adicionais aparecerão como NULL no conjunto de resultados. Você também pode escrever uma consulta dinâmica para obter todos os valores únicos da coluna pivot em tempo de execução e executá-la com a consulta pivot. Aqui está um exemplo:
-- Declarar variáveis necessárias
DECLARE @ConsultaSQL AS NVARCHAR(MAX)
DECLARE @ColunasPivot AS NVARCHAR(MAX)
-- Obter valores únicos da coluna pivot
SELECT @ColunasPivot = COALESCE(@ColunasPivot + ',', '') + QUOTENAME(Ano)
FROM (
SELECT DISTINCT Ano
FROM [dbo].[ExemploPivot]
) AS ExemploPivot
-- Criar a consulta dinâmica com todos os valores da coluna pivot em tempo de execução
SET @ConsultaSQL = N'SELECT País, ' + @ColunasPivot + '
FROM [dbo].[ExemploPivot]
PIVOT (
SUM(ValorVenda)
PARA Ano IN (' + @ColunasPivot + ')
) AS P'
-- Executar consulta dinâmica
EXEC sp_executesql @ConsultaSQL
Convertendo Colunas em Linhas – UNPIVOT
O operador UNPIVOT no SQL Server realiza a operação inversa do operador PIVOT. Ele gira os valores das colunas em valores de linha. Aqui está um exemplo:
SELECT País, Ano, ValorVenda
FROM [dbo].[ExemploDespivotar]
UNPIVOT (
ValorVenda PARA [Ano] IN ([2005], [2006], [2007], [2008])
) AS P
O UNPIVOT pode ser útil quando você precisa transformar seus dados de volta para o formato original ou quando deseja realizar análises adicionais nos valores individuais.
Conclusão
Neste artigo, discutimos como converter linhas em colunas e colunas em linhas no SQL Server usando os operadores PIVOT e UNPIVOT. Também exploramos como trazer dinamismo para o operador PIVOT escrevendo uma consulta dinâmica. Esses operadores podem ser ferramentas poderosas para transformação e análise de dados no SQL Server.