SQLServerLogo

Num post anterior abordei o uso do operador PIVOT na conversão de dados retornados por consultas no SQL Server. Possibilitando a transformação de valores associados a linhas em novas colunas, este comando dispensa os desenvolvedores da necessidade de escrever extensos trechos de código na realização deste tipo de tarefa.

Neste novo artigo abordarei o processo inverso, em que os valores de colunas servirão de base para reagrupar as informações em linhas. Isto será possível através do uso do operador UNPIVOT.

Exemplo de utilização do operador UNPIVOT

O exemplo demonstrado aqui fará uso de uma tabela chamada “CotacoesPorData”. Essa estrutura armazenará os valores das cotações de três moedas estrangeiras (dólar norte-americano, euro e libra esterlina) em uma determinada data. Na Listagem 1 está o script para a criação e inclusão de informações na tabela CotacoesPorData.

CREATE TABLE [dbo].[CotacoesPorData](
	[DataCotacao] [date] NOT NULL,
	[VlDolar] [numeric](18, 4) NULL,
	[VlEuro] [numeric](18, 4) NULL,
	[VlLibra] [numeric](18, 4) NULL,
	PRIMARY KEY ([DataCotacao])
)
GO

INSERT INTO dbo.CotacoesPorData(DataCotacao, VlDolar, VlEuro, VlLibra)
VALUES('2014-04-14', 2.214700, 3.061600, 3.704800)

INSERT INTO dbo.CotacoesPorData(DataCotacao, VlDolar, VlEuro, VlLibra)
VALUES('2014-04-15', 2.238500, 3.087400, 3.740000)

INSERT INTO dbo.CotacoesPorData(DataCotacao, VlDolar, VlEuro, VlLibra)
VALUES('2014-04-16', 2.241800, 3.101200, 3.770800)

INSERT INTO dbo.CotacoesPorData(DataCotacao, VlDolar, VlEuro, VlLibra)
VALUES('2014-04-17', 2.235700, 3.092700, 3.759300)

GO

Listagem 1: Scripts para criação e preenchimento da tabela CotacoesPorData

Executando uma consulta como a que consta na Listagem 2 será possível observar as diferentes cotações agrupadas por data (Imagem 1).

SELECT DataCotacao, VlDolar, VlEuro, VlLibra
FROM dbo.CotacoesPorData

Listagem 2: Efetuando uma consulta à tabela CotacoesPorData

Imagem001
Imagem 1. Resultado de uma consulta à tabela CotacoesPorData

O operador UNPIVOT permite o reagrupamento destas informações, com a conversão do valor de cotação de uma moeda em uma nova linha. Neste novo registro constará ainda a data correspondente à cotação, além do código da unidade monetária em questão. Na Listagem 3 estão as instruções que possibilitam estas transformações, ao passo que na Imagem 2 está o resultado da execução deste trecho de código.

Conforme se nota no exemplo, a utilização do operador UNPIVOT requer:

  • Um Sub-SELECT, com os dados que deverão ser transformados (na prática, um SELECT simples consultando dados da tabela CotacoesPorData). Cada coluna a ser transformada foi renomeada através de um alias (entre colchetes), o qual servirá de base para o preenchimento de um novo campo em que estará definido o código de uma moeda estrangeira (“USD” para dólar norte-americano, “EUR” para euro, “LIB” para libra esterlina);
  • Uma seção iniciada pelo comando UNPIVOT, em que constará primeiramente o nome da nova coluna onde serão agrupados os dados (no caso “ValorCotacao”). Após a palavra-chave “FOR” estará um segundo campo chamado “CodMoeda”, o qual armazenará o código de cada moeda estrangeira (empregando uma lista que referencia os aliases criados no passo anterior, sendo precedida pela palavra-chave “IN”);
  • Finalmente, no SELECT principal desta instrução SQL estarão os campos de data da cotação (“DataCotacao”), código da moeda (“CodMoeda”) e valor desta referência (“ValorCotacao”).
SELECT DataCotacao, CodMoeda, ValorCotacao
FROM
(
    SELECT DataCotacao,
           VlDolar AS [USD], VlEuro AS [EUR], VlLibra AS [LIB]
    FROM dbo.CotacoesPorData
) C
UNPIVOT
(
    ValorCotacao FOR CodMoeda IN ([USD], [EUR], [LIB])
) AS U

Listagem 3: Exemplo de utilização do operador UNPIVOT

Imagem002
Imagem 2. Exemplo de utilização do operador UNPIVOT

Encerro aqui mais um artigo. Procurei demonstrar neste novo post como o operador UNPIVOT pode ser utilizado na geração de informações num formato normalizado, concluindo com isto a série iniciada com a discussão a respeito do comando PIVOT.

Espero que este conteúdo possa ser útil no seu dia-a-dia.

Até uma próxima oportunidade!

Links

The UNPIVOT Operator
http://blogs.msdn.com/b/craigfr/archive/2007/07/17/the-unpivot-operator.aspx

Renato Groffe

Atua como consultor em atividades voltadas ao desenvolvimento de softwares há mais de 13 anos. Bacharel em Sistemas de Informação, com especialização em Engenharia de Software. Microsoft Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.NET, Windows Forms), Microsoft Specialist (HTML5 with JavaScript and CSS3, Developing ASP.NET MVC 4 Web Applications), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP, SCWCD), ITIL Foundation V2, Cobit 4.1 Foundation.

Facebook Google+ 

Comentários

comentarios