PIVOT - Convertendo Linhas em Colunas (pt-BR)

PIVOT - Convertendo Linhas em Colunas (pt-BR)

Nota de Migração: Este artigo foi migrado para o Portal Wiki em Português. O conteúdo será atualizado aqui http://social.technet.microsoft.com/wiki/pt-br/contents/articles/12563.pivot-convertendo-linhas-em-colunas.aspx.





Introdução


Muitas vezes ao fazer relatórios nos deparamos com esta situação.
Você possui dados em Linhas que precisam ser convertidos em Colunas, também conhecido como inversão de matriz.
Antes tínhamos que fazer malabarismos (group by, sum, count, case) para obter o resultado desejado.
Agora vamos aprender o comando PIVOT, no começo pode assustar, mas após usar algumas vezes verá que é bem simples.


Vamos começar pela sintaxe


SELECT <non-pivoted column>,
    [primeira pivoted column] AS <Nome da Coluna>,
    [segunda pivoted column] AS <Nome da Coluna>,
    ...
    [última pivoted column] AS <Nome da Coluna>
FROM
    (<SELECT consulta que produz os dados>) AS <apelido para a consulta>
PIVOT
    (<função de agregação>(<Coluna sendo agregada>)
        FOR [<Coluna que contém o valor se tornará o cabeçalho>] IN ( [primeira pivoted column], [segunda pivoted column], ... [última pivoted column])
) AS <apelido para a pivot table>

Criando ambiente


Create table #Atendimento
(
    ID int identity(1,1) primary key,
    Area varchar(10),
    Tipo varchar(20),
    Data datetime
)
GO
 
INSERT INTO #Atendimento VALUES('Contabil','Troca de Senha','2011-11-12')
INSERT INTO #Atendimento VALUES('Contabil','Instalação','2011-11-11')
INSERT INTO #Atendimento VALUES('Contabil','Backup','2011-12-02')
INSERT INTO #Atendimento VALUES('Contabil','Troca de Senha','2011-11-16')
INSERT INTO #Atendimento VALUES('Financeiro','Dúvida','2011-12-06')
INSERT INTO #Atendimento VALUES('Financeiro','Backup','2011-12-07')
INSERT INTO #Atendimento VALUES('Financeiro','Troca de Senha','2011-12-10')
INSERT INTO #Atendimento VALUES('Financeiro','Troca de Senha','2011-12-11')
INSERT INTO #Atendimento VALUES('Financeiro','Backup','2011-11-18')
INSERT INTO #Atendimento VALUES('Financeiro','Dúvida','2011-11-20')
INSERT INTO #Atendimento VALUES('Financeiro','Troca de Senha','2011-11-21')
INSERT INTO #Atendimento VALUES('Financeiro','Dúvida','2011-11-22')
INSERT INTO #Atendimento VALUES('Financeiro','Dúvida','2011-11-23')
GO


Exibindo a tabela


SELECT * FROM #Atendimento



Vamos começar a utilizar o comando PIVOT

Selecionando total de atendimento por Área, separando por meses


SELECT Area,[10] AS Outubro, [11] as Novembro, [12] as Dezembro
FROM
    (Select Area,ID, MONTH(Data) Mes From #Atendimento) Atend
PIVOT(count(ID) for Mes in ([10], [11],[12])) P
ORDER BY Area



Selecionando total de atendimento por Tipo, separando por meses


SELECT Tipo,[10] AS Outubro, [11] as Novembro, [12] as Dezembro
FROM
    (Select Tipo,ID, MONTH(Data) Mes From #Atendimento) Atend
PIVOT(count(ID) for Mes in ([10], [11],[12])) P
ORDER BY Tipo



Selecionando total de atendimento por Área e Tipo, separando por meses


SELECT Area, Tipo,[10] AS Outubro, [11] as Novembro, [12] as Dezembro
FROM
    (Select Area,Tipo,ID, MONTH(Data) Mes From #Atendimento) Atend
PIVOT(count(ID) for Mes in ([10], [11],[12])) P
ORDER BY Area, Tipo



Apagando a tabela temporária


DROP TABLE #Atendimento



Ozimar Henrique
http://ozimar.com

Leave a Comment
  • Please add 7 and 4 and type the answer here:
  • Post
Wiki - Revision Comment List(Revision Comment)
Sort by: Published Date | Most Recent | Most Useful
Comments
  • Luciano Lima [MVP] Brazil edited Original. Comment: ajustado formatação e adicionado o [TOC]

Page 1 of 1 (1 items)
Wikis - Comment List
Sort by: Published Date | Most Recent | Most Useful
Posting comments is temporarily disabled until 10:00am PST on Saturday, December 14th. Thank you for your patience.
Comments
  • Luciano Lima [MVP] Brazil edited Original. Comment: ajustado formatação e adicionado o [TOC]

Page 1 of 1 (1 items)