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, [primeira pivoted column] AS , [segunda pivoted column] AS , ... [última pivoted column] AS FROM (
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
Criando ambiente:
Create table #Atendimento
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('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
INSERT INTO #Atendimento VALUES('Financeiro','Dúvida','2011-11-23')
GO
--Exibindo a tabela
SELECT * FROM #Atendimento
Vamos começar a usar 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
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
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