Database
 sql >> Base de Dados >  >> RDS >> Database

Entendendo as instruções PIVOT, UNPIVOT e Reverse PIVOT


A instrução PIVOT é usada para converter linhas da tabela em colunas, enquanto o operador UNPIVOT converte colunas de volta em linhas. A reversão de uma instrução PIVOT refere-se ao processo de aplicação do operador UNPIVOT ao conjunto de dados já PIVOTADO para recuperar o conjunto de dados original.

Neste artigo, estudaremos esses três conceitos em diferentes exemplos.


Operador PIVOT


Conforme mencionado anteriormente, o operador PIVOT converte as linhas da tabela em colunas. Por exemplo, se você tiver uma tabela assim:



e girá-lo pela terceira coluna, o resultado será o seguinte:



Na tabela original, tínhamos dois valores únicos para as colunas do Curso – Inglês e Histórico. Na tabela dinâmica, esses valores exclusivos foram convertidos em colunas. Você pode ver que os valores de pontuação para cada nova coluna permanecem inalterados. Por exemplo, na tabela original, uma estudante, Sally, havia pontuado 95 em inglês, diferentemente dos valores da tabela dinâmica.

Como sempre, certifique-se de fazer um backup seguro antes de fazer qualquer ajuste em um banco de dados ativo.

Vejamos este exemplo de uso do operador PIVOT no SQL Server.
CREATE DATABASE School
GO

USE School
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Course VARCHAR (50),
	Score INT
)
GO

INSERT INTO Students VALUES ('Sally', 'English', 95 )
INSERT INTO Students VALUES ('Sally', 'History', 82)
INSERT INTO Students VALUES ('Edward', 'English', 45)
INSERT INTO Students VALUES ('Edward', 'History', 78)

O script acima cria o banco de dados School. No banco de dados, criamos a tabela Alunos com quatro colunas, como Id, StudentName, Course e Score. Por fim, adicionamos os quatro registros fictícios à tabela Estudantes.

Agora, se você usar uma instrução SELECT para recuperar todos os registros, verá o seguinte:



Vamos PIVOT esta tabela pela coluna Course. Para isso, execute o seguinte script:
SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot

Vamos ver o que está acontecendo no roteiro. Na primeira linha, usamos a instrução SELECT para definir as colunas que queremos adicionar à tabela dinâmica. As duas primeiras colunas são StudentName e Score. Os dados para essas duas colunas virão diretamente da tabela Alunos. A terceira coluna é Curso. Queremos PIVOT nossa tabela pela coluna Course, portanto, a coluna Course será dividida no número de colunas igual aos valores especificados pelo operador PIVOT para a coluna Course.

A sintaxe do operador PIVOT é simples. Primeiro, você deve aplicar uma função agregada à coluna cujos valores deseja exibir nas colunas dinâmicas. No nosso caso, queremos mostrar a pontuação nas colunas dinâmicas – inglês e histórico. Por fim, usamos uma instrução FOR para especificar a coluna pivô e os valores exclusivos nela. O resultado fica assim:


Operador UNPIVOT


O operador UNPIVOT é usado para converter colunas da tabela em linhas. Por exemplo, se você tiver uma tabela assim:



O operador UNPIVOT retornará os seguintes resultados:



As colunas da tabela original foram convertidas nas linhas da tabela não dinâmica. Vamos usar esses dados para ver como o operador UNPIVOT funciona no SQL.

Para isso, execute o seguinte script:
CREATE DATABASE School2
GO

USE School2
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Math INT,
	English INT,
	History INT,
	Science INT
)
GO

INSERT INTO Students VALUES ('Sally', 78, 85, 91, 76 )
INSERT INTO Students VALUES ('Edward', 87, 90, 82, 87)

Se você selecionar os dados da tabela Alunos do banco de dados School2, verá os seguintes resultados:



Para aplicar o operador UNPIVOT a esta tabela, execute a seguinte consulta:
SELECT StudentName, Course, Score
FROM Students
UNPIVOT
(
	Score
	FOR Course in (Math, English, History, Science)
) AS SchoolUnpivot

A sintaxe do operador UNPIVOT é semelhante à do PIVOT. Na instrução SELECT, você precisa especificar as colunas que deseja adicionar à tabela de saída. Na instrução UNPIVOT, você especificará duas colunas:
  1. A primeira coluna contém os valores das linhas das colunas dinâmicas (que é a pontuação neste caso).
  2. A segunda coluna inclui os nomes das colunas dinâmicas, ou seja, matemática, inglês, história e ciências.

A tabela de saída ficará assim:


Invertendo um PIVOT


A reversão de um operador PIVOT refere-se ao processo de aplicação do operador UNPIVOT a uma tabela dinâmica para retornar à tabela original.

Inverter tabela dinâmica não agregada

A reversão de um operador PIVOT só é possível se a tabela dinâmica não contiver dados agregados.

Vejamos a tabela que usamos na seção PIVOT deste artigo.



Você pode ver que não há linhas repetidas. Ou seja, podemos dizer que para cada aluno há apenas um registro por curso. Por exemplo, Sally tem apenas um recorde para sua pontuação no curso de inglês.

Quando aplicamos o operador PIVOT na tabela acima obtivemos o seguinte resultado:



Agora, vamos aplicar o operador UNPIVOT a este resultado e ver se podemos voltar à tabela original. Para isso, execute o seguinte script:

Observação:

Podemos executar esta consulta no banco de dados School que criamos na seção do operador PIVOT.
SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

Aqui usamos uma subconsulta para aplicar o operador UNPIVOT aos dados dinâmicos. A consulta interna emprega o operador PIVOT, enquanto a consulta externa usa o operador UNPIVOT. Na saída, você verá a tabela Alunos originais.

Invertendo a tabela dinâmica agregada

Dissemos anteriormente que só é possível reverter um operador PIVOT que não contenha dados agregados. Vamos tentar reverter a instrução PIVOT que contém dados agregados.

Adicione outro registro à tabela Alunos do banco de dados Escola que criamos na primeira seção deste artigo. Para fazer isso, execute a seguinte consulta:
INSERT INTO Students VALUES ('Edward', 'History', 78)

Agora, se você selecionar todos os registros da tabela Alunos, obterá a seguinte saída:



Podemos ver que temos um registro duplicado para a pontuação de Edward na História.

Agora, aplique o operador PIVOT a esta tabela.
SELECT Id, StudentName, English, History
FROM Students
PIVOT
(
	SUM (Score)
	FOR Course in (English, History)
) AS Schoolpivot



A partir da saída, você pode ver que a função SOMA no operador PIVOT adicionou duas pontuações ao curso de História realizado por Edward. Se você tentar reverter o pivô desta tabela (ou seja, aplicar o operador UNPIVOT), você não receberá a tabela original. Ele retornará os quatro registros em vez dos cinco originais. A coluna Histórico do aluno Edward conterá o resultado agregado em vez dos resultados individuais.

Para ver isso, execute o seguinte script:
SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

A tabela de saída ficará assim:



Referências:
  • Microsoft:usando PIVOT e UNPIVOT
  • Codingsight:usando PIVOT em SQL
  • YouTube:vídeo PIVOT reverso