Exemplo de UNPIVOT no SQL Server

Com este exemplo de T-SQL, pode facilmente transformar colunas em linhas com apenas um passo, graças à função UNPIVOT do SQL Server.

E o oposto exato da consulta PIVOT. Neste exemplo, apenas os seis primeiros meses do ano são usados como colunas, ou seja, de Janeiro a Junho. No entanto, pode estender a consulta para todos os 12 períodos do ano, adicionando os que faltam.

1. Criar dados para transformar em linhas usando o operador UNPIVOT

Por exemplo, a tabela de Vendas do SQL Server contém uma coluna de tipo e colunas dos meses. Elas contêm, respetivamente, o tipo e o montante das vendas para o mês. Para começar, basta copiar e colar a consulta SQL para a criação da tabela no SSMS.

Primeiro, crie a tabela de exemplo usando este script, simplesmente copie e cole o exemplo na janela do seu SQL Server Management Studio.

-- Primeiro, elimine a tabela de vendas por mês se já existir na base de dados
IF EXISTS( 
	SELECT 1 FROM sys.objects
     WHERE object_id = object_id(N'[dbo].[SALES_BY_MONTH]')
		AND type in (N'U') )
-- BEGIN DROP TABLE [dbo].[SALES_BY_MONTH]
END;

-- Criar a tabela de VENDAS
CREATE table [dbo].[SALES_BY_MONTH] (
    [SalesType] NVARCHAR(20),
    [January] NUMERIC(5),
    [February] NUMERIC(5),
    [March] NUMERIC(5),
    [April] NUMERIC(5),
    [May] NUMERIC(5),
    [June] NUMERIC(5)
);

2. Inserir dados na tabela fonte a transformar

Em seguida, insira os dados na tabela a ser transposta. Cada inserção de dados no SQL adiciona 12 novos montantes de vendas. Uma coluna por mês, com o tipo de vendas associado.

Adicione os meses que faltam, se necessário. Assim, poderá transformar os 12 meses do ano de colunas para linhas numa única consulta do SQL Server.

-- Inserir dados de vendas de amostra para cada mês: ou seja, de Janeiro a Junho
-- As colunas dos meses serão pivotadas de colunas para linhas
INSERT INTO dbo.SALES_BY_MONTH ( [SalesType], [January], [February], [March], [April], [May], [June] )
VALUES ( N'Sales', 1000, 2000, 3000, 4000, 5000, 6000);

INSERT INTO dbo.SALES_BY_MONTH ( [SalesType], [January], [February], [March], [April], [May], [June] )
VALUES ( N'Discounts', 100, 200, 300, 400, 500, 600);

INSERT INTO dbo.SALES_BY_MONTH ( [SalesType], [January], [February], [March], [April], [May], [June] )
VALUES ( N'Offers', 10, 20, 30, 40, 50, 60);

-- Verificar as linhas inseridas na tabela de vendas
SELECT * 
FROM   dbo.SALES_BY_MONTH;
Inserir dados para transformar de colunas para linhas usando T-SQL UNPIVOT
Inserir dados para transformar de colunas para linhas usando T-SQL UNPIVOT

3. Consulta UNPIVOT do SQL Server para transformar colunas em linhas

Finalmente, a função UNPIVOT do SQL Server é composta por 3 passos diferentes para transpor as colunas em linhas.

  1. A seleção das 3 colunas de resultado, ou seja, Tipo, Mês e Montante.
  2. Depois, a subconsulta SQL com a seleção original de dados.
  3. A operação UNPIVOT em si, com os 6 meses nomeados explicitamente.
-- UNPIVOT de Colunas para Linhas com Consulta SQL
SELECT [TYPE], Month, Amount
FROM (	
	SELECT [TYPE], [January], [February], [March], [April], [May], [June]
	FROM dbo.SALES_BY_MONTH 	) sbm
UNPIVOT
   (Amount FOR Month IN 
      ([January], [February], [March], [April], [May], [June])
)AS SalesUnPivot;
Exemplo de consulta UNPIVOT no SQL Server no SSMS
Exemplo de consulta UNPIVOT no SQL Server no SSMS

Sobre os Operadores PIVOT e UNPIVOT do SQL Server

Adicionalmente, se ainda estiver com dificuldades com este operador UNPIVOT do SQL Server e a sua sintaxe, basta copiar e colar o exemplo e repetir os três passos, adaptando ao seu caso real. Comece por renomear as colunas para entender como funciona. Em conclusão, para ler mais detalhes, a documentação oficial da Microsoft para a função unpivot está disponível. O UNPIVOT é o oposto da função PIVOT, aqui está outro tutorial curto para usar a função PIVOT do SQL Server.

Seja o primeiro a comentar

Deixe uma resposta

O seu endereço de email não será publicado.


*