Você está na página 1de 11

07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

Recebe as atualizações da maior Plataforma para


Programadores do Brasil.

NÃO EU QUERO AGORA

Artigo

Invista em você! Saiba como a DevMedia pode ajudar sua


carreira.

PIVOT no SQL Server: invertendo linhas e


colunas em um exemplo real
Veja neste artigo como utilizar o operador PIVOT no SQL Server para inverter as linhas com as
colunas de uma consulta.

Marcar como lido Anotar

Imagine que em um dia você se depara com a seguinte situação, precisa


transformar as linhas do meu SELECT em COLUNAS, você logo pode pensar “vou
fazer pelo meu so ware”, usando o Delphi, .NET, Java, etc. Mas fazer um
processamento deste tamanho gera consumo de recurso, o que torna seu
aplicativo mais lento. O ideal neste tipo de processamento é deixar o nosso
servidor/Banco de Dados executar. Para essa situação temos um operador muito
interessante e até um pouco desconhecido por muitos, o PIVOT.

Muito se fala sobre PIVOT, mas o pessoal sempre se pergunta: O que é? Qual a
sintaxe? Como aplicar em um SELECT com colunas xas? Como aplicar em um

28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 1/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

SELECT com colunas dinâmicas? Vamos esclarecer e explicar cada uma destas
Recebe as atualizações da maior Plataforma para
perguntas. Programadores do Brasil.

O que é o PIVOT? NÃO EU QUERO AGORA

O operador PIVOT no SQL Server, gera uma expressão com seus valores em
tabela, ou seja, ele pega os dados que cam em formato horizontal (linhas) e os
coloca em formato vertical (Colunas).

Veja um exemplo bem claro do formato horizontal (linhas):

CodProduto Descricao Tamanho QTD_ESTOQUE


AA3705322 BLUSA BASICA P 28
AA3705322 BLUSA BASICA M 33
AA3705322 BLUSA BASICA G 33
AA3705322 BLUSA BASICA GG 27
AA3705322 BLUSA BASICA UN 23

Veja um exemplo de como seria usando o PIVOT (transformando as linhas em


colunas)

CodProduto Descricao P M G GG UN
AA3705322 BLUSA BASICA 28 33 33 27 23

Qual a sintaxe?

A sintaxe usada no PIVOT parece ser um pouco complexa, mas não é, ela é
simples, não iremos detalhar essa sintaxe, pois o objetivo principal é mostrar na
prática.
28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 2/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

Listagem 1: Sintaxe do PIVOT


Recebe as atualizações da maior Plataforma para
Programadores do Brasil.
1 SELECT <non-pivoted column>,
2 [first pivoted column] AS <column name>,
3 NÃO name>, EU QUERO AGORA
[second pivoted column] AS <column
4 ...
5 [last pivoted column] AS <column name>
6 FROM
7 (<SELECT query that produces the data>)
8 AS <alias for the source query>
9 PIVOT
10 (
11 <aggregation function>(<column being aggregated>)
12 FOR
13 [<column that contains the values that will become column headers>]
14 IN ( [first pivoted column], [second pivoted column],
15 ... [last pivoted column])
16 ) AS <alias for the pivot table>
17 <optional ORDER BY clause>;

Como aplicar em um SELECT comum?

Essa é a forma mais comum de aplicar o PIVOT em uma consulta. Você conhece a
quantidade exata de colunas desejadas, como por exemplo, um relatório ANUAL
das suas vendas.

A forma tradicional seria o seguinte relatório:

ANO MÊS VALOR


2013 1 R$ 785.694,00
2013 2 R$ 46.582,00
2013 3 R$ 216.594,00
2013 4 R$ 56.223,00
2013 5 R$ 112.546,00
2013 6 R$ 1.202.355,00
2013 7 R$ 120.036,00
2013 8 R$ 804.665,00
28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 3/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

ANO MÊS VALOR


Recebe as atualizações da maior Plataforma para
2013 9 R$ 601.128,00
Programadores do Brasil.
2013 10 R$ 9.564.122,00
2013 11 R$ 900.064,00
NÃO EU QUERO AGORA
2013 12 R$ 487.562,00

Agora, usando o PIVOT teríamos o seguinte resultado:

Ano Janeiro Fevereiro Março Abril Etc....


2013 R$ 785.694,00 R$ 46.582,00 R$ 216.594,00 R$ 56.223,00 .........

Como sabemos que o relatório é anual, temos como prever o seu tamanho. Ele
terá que preencher todos os meses do ano, no caso teremos 12 colunas (as
colunas foram suprimidas para facilitar a leitura deste artigo), fora a coluna do
ano.

Listagem 2: PIVOT em colunas FIXAS

1 SELECT ANO
2 , [1] AS JANEIRO
3 , [2] AS FEVEREIRO
4 , [3] AS MARÇO
5 , [4] AS ABRIL
6 , [5] AS MAIO
7 , [6] AS JUNHO
8 , [7] AS JULHO
9 , [8] AS AGOSTO
10 , [9] AS SETEMBRO
11 , [10] AS OUTUBRO
12 , [11] AS NOVEMBRO
13 , [12] AS DEZEMBRO
14 FROM VENDAANUAIS PIVOT (SUM(VALOR)
15 FOR MES IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]))P
16 ORDER BY 1;

28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 4/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

Na parte de inicial fazemos um SELECT normal, onde colocamos um nome para


Recebe as atualizações da maior Plataforma para
as colunas, apenas um apelido, usandodo
Programadores o 'AS', subentendendo que 1 = JAN, 2 = FEV,
Brasil.

3 = MAR, e assim por diante.


NÃO EU QUERO AGORA
Em seguida informamos qual seria a tabela onde os dados estão localizados. Logo
após, colocamos o operador PIVOT, este por sua vez será usado com uma função
de agregação, neste caso o SUM e agrupando os valores de cada mês.

Finalizando, usamos o 'FOR IN', para preencher os respectivos valores em suas


colunas. E nalizando com um ORDER BY comum.

Como aplicar em um SELECT dinâmico?

Neste momento é o ponto mais interessante do nosso artigo, temos a parte


dinâmica, onde você não sabe qual é o número de COLUNAS que o seu SELECT
irá gerar. O código abaixo mostra uma situação REAL do dia-a-dia de muitos
desenvolvedores, temos a seguinte estrutura para o nosso banco de dados de
exemplo:

Figura 1: Modelagem das tabelas


28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 5/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

Com base no modelo das tabelas acima, iremos destrinchar de forma parcelada o
Recebe as atualizações da maior Plataforma para
SELECT com o PIVOT, para que que dedofácil
Programadores entendimento.
Brasil.

O código abaixo mostra o começo da declaração do nosso SCRIPT, e tamanho


NÃO EU QUERO AGORA
de nimos a quantidade de colunas dinâmicas.

Listagem 3: Preparando o SCRIPT

1 DECLARE@SQLStrVARCHAR(5000)
2 SET@SQLStr=''
3 SELECT@SQLStr=@SQLStr+'['+[a].[Column]+'], '
4 FROM
5 (SELECTDISTINCTCONVERT(VARCHAR(2),NomeTamanho)as[Column]
6 FROMTamanhos
7 )asa
8 SET@SQLStr=LEFT(@SQLStr,len(@SQLStr)-1)

Como podemos notar, o script inicial tem apenas uma declaração de uma variável
do tipo VARCHAR. Logo após é declarado um apelido para nossa tabela chamado
de 'a' e em seguida é de nido o nome da coluna, neste caso usamos o 'Column'.

Posteriormente é feito um SELECT na tabela TAMANHOS e assim podemos


descobrir todos (nesse momento estamos trabalhando com o SELECT dinâmico,
pois podemos ter 10 ou 100 tamanhos, isso não importa para o SCRIPT) os
tamanhos que temos e com isso preparar as nossas colunas. Note que está sendo
usando o DISTINCT apenas para garantir que dados repetidos não sejam exibidos,
caso isso aconteça, teremos um erro, pois as colunas não podem ter nomes
iguais.

Foi de nido um apelido para a tabela assim como acima o 'a'. Em seguida
atribuimos o conteúdo acima para a nossa variável @SQLStr.

Neste momento chegamos ao ponto, onde podemos de nir a nossa regra de


negocio, ou seja, escolher as colunas que vão ser exibidas, escolher as clausulas,

28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 6/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

de nirmos agrupamentos, etc. Não se prenda nas regras de negocio, elas estão ali
Recebe as atualizações da maior Plataforma para
apenas pra ilustrar o SCRIPT proposto com
Programadores base na Figura 1.
do Brasil.

Listagem 4: De nindo a regra de negocio do seu PIVOT e preenchendo as colunas


NÃO EU QUERO AGORA

1 SET@SQLStr='SELECT Descricao, CodProduto, '


2 +@SQLStr
3 +' FROM (SELECT P.Descricao, P.CodProduto, T.NomeTamanho, SUM(IP.Quant) QTDETO
4 ' FROM Produtos P, GradeProdutos GP, Tamanhos T, ItensPedidos IP '+
5 ' WHERE P.CodProduto = GP.CodProduto '+
6 ' AND P.CodProduto = IP.CodProduto '+
7 ' AND GP.CodTamanho = T.CodTamanho '+
8 ' AND IP.CodTamanho = T.CodTamanho '+
9 ' AND SUBSTRING(P.CodProduto, 1,2 ) = ''CL'' '+
10 ' AND SUBSTRING(P.CodProduto, 5,3 ) = ''053'' '+
11 ' AND YEAR(P.DATA) >= 2012 '+
12 ' GROUP BY P.CodProduto, P.Descricao, T.NomeTamanho '+
13 ' ) sq PIVOT (SUM(QTDETOTAL) FOR NomeTamanho IN('
14 +@SQLStr+')) AS pt'
15 PRINT@SQLStr
16 EXEC(@SQLStr)

Podemos notar que temos um SCRIPT simples, onde usamos os campos,


Descricao, CodProduto, NomeTamnho e QTDETOTAL. As tabelas envolvidas,
conforme a Figura 1, e posteriormente a instrução WHERE, com as condições de
relacionamento, nele você pode fazer vários e vários tipos de ltro.

Assim como o PIVOT xo, temos a mesma forma de implementar no nosso PIVOT
dinâmico, a diferença é que não precisamos colocar as colunas xas [1], [2], [3],
[4], [5], [etc...], pois este trabalho ca a cargo da primeira parte do SCRIPT.

Quase no nal, usamos o comando PRINT, apenas pra imprimir no box


mensagem, o comando que foi executado, veja como cou quando executamos
em um banco de dados:

Listagem 5: Exemplo do comando Print

1 SELECT Descricao, CodProduto, [G ],[GG], [M ], [P ], [PP], [RN], [UN], [XG]


28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 7/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

2 FROM (SELECT P.Descricao, P.CodProduto, T.NomeTamanho, SUM(IP.Quant) QTDETOTAL


3 Recebe as atualizações
FROM Produtos P, GradeProdutos GP, TamanhosdaT,
maior PlataformaIPpara
ItensPedidos
4 WHERE P.CodProduto =Programadores
GP.CodProduto do Brasil.
5 AND P.CodProduto = IP.CodProduto
6 AND GP.CodTamanho = T.CodTamanho
7 AND IP.CodTamanho = T.CodTamanho
NÃO EU QUERO AGORA
8 ANDSUBSTRING(P.CodProduto, 1,2 ) = 'CL'
9 AND SUBSTRING(P.CodProduto, 5,3 ) = '053'
10 AND YEAR(P.DATA) >= 2012
11 GROUP BY P.CodProduto, P.Descricao, T.NomeTamanho ) sq
12 PIVOT (SUM(QTDETOTAL) FOR NomeTamanho IN ([G ], [GG], [M ], [P ], [PP], [RN], [U

Agora nalizando o nosso SCRIPT, temos o comando que executa a nossa


consulta, o EXEC, e com isso fechamos o SCRIPT do PIVOT, veja o resultado da
consulta:

Descricao CodProduto G GG M P PP RN UN
BATA NN1405302 27 NULL 25 NULL 25 NULL NULL
CALCA
NN2105304 30 NULL 28 NULL NULL NULL NULL
LINHO
CASACO
NN3205313 24 33 24 NULL NULL NULL NULL
MOLETON
BLUSA
NN3705309 29 NULL 26 25 NULL NULL NULL
BASICA
BLUSA
NN3705314 29 33 25 25 NULL NULL NULL
BASICA MG
BLUSA LACO NN3805304 32 NULL 31 NULL NULL NULL 33
BLUSA
NN3805306 31 NULL 30 NULL 54 NULL NULL
LISTRADA
BLUSA MG NN3805308 31 NULL 28 NULL NULL NULL NULL
VESTIDO
NN4205302 34 NULL 35 NULL NULL NULL NULL
VERMELHO
BLUSA
NN5105314 35 11 33 NULL NULL 11 22
BOTAO
SAIA
NN5205309 32 NULL 31 NULL NULL NULL NULL
ESTAMPADAS 28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 8/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

Descricao CodProduto G GG M P PP RN UN
Recebe as atualizações da maior Plataforma para
BLUSA Programadores do Brasil.
NN5705321 30 NULL 27 25 NULL NULL 22
XADREZ

NÃO EU QUERO AGORA

Usar o recurso de operador PIVOT em um primeiro momento pode assustar,


porém, como podemos notar ele é um poderoso recurso e não é tão complexo
quanto parece, agora basta adaptar o exemplo para a sua realidade. Use a sua
imaginação e as suas consultas carão perfeitas.

Marcar como lido Anotar

Por Wesley
Em 2013

RECEBA NOSSAS NOVIDADES

Informe o seu e-mail

Receber Newsletter

Suporte ao aluno - Deixe a sua dúvida.


28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 9/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

Recebe as atualizações da maior Plataforma para


Programadores do Brasil.

NÃO EU QUERO AGORA

ASSINATURA DEVMEDIA

Fa?a parte dessa comunidade 100% focada em programação e tenha acesso


ilimitado. Nosso compromisso é tornar a sua experiência de estudo cada vez mais
dinâmica e ef iciente. Portanto, se você quer programar de verdade seu lugar é
aqui. Junte-se a mais de...

+ 800 MIL
PROGRAMADORES

69 ,90*
/ MÊS

Séries
Projetos completos
Cursos
Guias de carreiras

DevCasts
Desa os
Artigos
App
Suporte em tempo real

Assine

28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 10/11
07/11/2019 PIVOT no SQL Server: invertendo linhas e colunas em um exemplo real

A assinatura é cobrado através do seu cartão de crédito. *Tempo mínimo de assinatura: 12


Recebe as atualizações
meses. da maior Plataforma para
Programadores do Brasil.

NÃO EU QUERO AGORA

Plataforma para Programadores

Compre por telefone:

(21) 3593-6903

Revistas

Baixe o App

Fale conosco

Trabalhe conosco

Assinatura para empresas

Hospedagem web por Porta 80 Web Hosting

Av. Ayrton Senna 3000, Shopping Via Parque, grupo 3087 - Barra da Tijuca - Rio de Janeiro - RJ

28

https://www.devmedia.com.br/pivot-no-sql-server-invertendo-linhas-e-colunas-em-um-exemplo-real/28318 11/11