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.
Tabela de Conteúdos
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;
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.
- A seleção das 3 colunas de resultado, ou seja, Tipo, Mês e Montante.
- Depois, a subconsulta SQL com a seleção original de dados.
- 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;
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