Mais um operador interessante que deveria estar na ToolBox de todo DBA/Desenvolvedor SQL Server. O Operador PIVOT.
Disponivel a partir da versão 2005/2008 para converter linhas em colunas (e vice versa), o Pivot é um só um pouco dificil de entender, mas depois que voce
pega o jeito percebe que é bem facil e eficiente nas suas consultas. Então mãos a obra!
Em uma base de dados de um sistema de e-commerce, temos a tabela Fluxo_Pedido que armazena as datas em que cada processo de um pedido foi realizado conforme Figura 1
*//*
Nosso cliente deseja a seguinte visualização dessa informação
*/
/* Agora dê uma olhada na syntax padrão do operador PIVOT */
[Primeira coluna pivoted] AS <alias da coluna>,
[Segunda coluna pivoted] AS <alias da coluna>, ...
[Ultima coluna pivoted] AS <alias da coluna>
FROM
(<Consulta fonte>) AS <alias da consulta fonte>
PIVOT --<< AQUI ESTÁ O OPERADOR!
(
<Valor agregado>FOR
[Coluna do cabeçalho]
IN (
[Primeira coluna pivoted],
[Segunda coluna pivoted]...
[Ultima coluna pivoted]
)
) AS <alias da tabela pivot>
/*
Agora dando nomes ao bois! A coluna non pivoted é a coluna que agrupa as linhas. No nosso caso é o Numero do Pedido, pois teremos uma linha para cada pedido
As colunas pivoted são os valores que passarão a ser colunas da tabela.Aqui colocamos a coluna Etapa e criaremos uma coluna para cada etapa (Solicitacao, Pagamento, Transportadora,Finalizacao)
Veja como ficou:
*/ SELECT
NumeroPedido, [Solicitação],
[Pagamento],
[Transportadora],
[Finalizacao]
FROM
(<Consulta fonte>) AS <alias da consulta fonte>
PIVOT
(
<Valor agregado>
FOR
[Coluna do cabeçalho]
IN (
[Primeira coluna pivoted],
[Segunda coluna pivoted]
...
[Ultima coluna pivoted])
) AS <alias da tabela pivot>
Devemos incluir no select a coluna non-pivoted, a coluna que possui os valores pivoted e o campo que será exibido nas células (DataEtapa)
ou seja:
SELECT NumeroPedido,Etapa ,DataEtapa FROM Fluxo_Pedido
*/ SELECT
NumeroPedido, [Solicitação],
[Pagamento],
[Transportadora],
[Finalizacao]
FROM
(SELECT NumeroPedido,Etapa ,DataEtapa FROM Fluxo_Pedido) AS Consulta_Fonte
PIVOT
( <Valor agregado>
FOR
[Coluna do cabeçalho]
IN (
[Primeira coluna pivoted],
[Segunda coluna pivoted]
...
[Ultima coluna pivoted]
)
) AS <alias da tabela pivot>
/*
E por fim vamos dar os parametros do operador PIVOT.
O valor agregado deve ser uma função de agrupamento (MAX(), MIN(),COUNT(),etc...) e a coluna que vamos no nosso "miolo".
Como vamos exibir a data em que foi executada cada etapa vamos usar MIN(DataEtapa)
SELECT
NumeroPedido, [Solicitação],
[Pagamento],
[Transportadora],
[Finalizacao]
FROM
(SELECT NumeroPedido,Etapa ,DataEtapa FROM Fluxo_Pedido) AS Consulta_Fonte
PIVOT
(
MAX(DataEtapa)
FOR
Etapa
IN (
[Solicitação],
[Pagamento],
[Transportadora],
[Finalizacao]
)
) AS TabelaPivot
/* E pronto!! Temos uma PIVOT novinha em folha!
Obrigado pela leitura e espero ter ajudado você em seu dia a dia
Comente abaixo, sugira na nossa caixinha de sugestõe e se tiver duvidas me mande um email: fjantunes@gmail.com.br
Abraços!
*/
Cara, muito bom.
ResponderExcluirEstava procurando isso a muito tempo...
Depois me cobre de mostrar para você o resultado.
Parabéns rapaz!
Muito legal Felipão! Acho PIVOT muito útil (ainda mais para relatórios =p) e a explicação ficou bem simples de se entender e completa.
ResponderExcluirDuca essa hein...
ResponderExcluirE a performance Fe... esse cara aguenta grandes volumes de dados?
Ah... e os relatorios do STFlow usam esse? rsss
Já ajudou!
ResponderExcluirÓtimo post.
Já ajudou!
ResponderExcluirÓtimo post.
Muito bom Felps.
ResponderExcluirFatalmente salvará muitas vidas.