Database
 sql >> Database >  >> RDS >> Database

Comprensione delle dichiarazioni PIVOT, UNPIVOT e Reverse PIVOT

L'istruzione PIVOT viene utilizzata per convertire le righe della tabella in colonne, mentre l'operatore UNPIVOT riconverte le colonne in righe. L'inversione di un'istruzione PIVOT si riferisce al processo di applicazione dell'operatore UNPIVOT al set di dati già PIVOTED al fine di recuperare il set di dati originale.

In questo articolo, studieremo questi tre concetti su diversi esempi.

Operatore PIVOT

Come accennato in precedenza, l'operatore PIVOT converte le righe della tabella in colonne. Ad esempio, se hai una tabella simile a questa:

e ruotalo per la terza colonna, il risultato sarà il seguente:

Nella tabella originale, avevamo due valori univoci per le colonne del corso:inglese e storia. Nella tabella pivot, questi valori univoci sono stati convertiti in colonne. Puoi vedere che i valori del punteggio per ogni nuova colonna rimangono invariati. Ad esempio, nella tabella originale, una studentessa, Sally, aveva ottenuto un punteggio di 95 in inglese, a differenza dei valori della tabella pivot.

Come sempre assicurati di eseguire un backup sicuro prima di apportare modifiche a un database attivo.

Diamo un'occhiata a questo esempio di utilizzo dell'operatore PIVOT in 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)

Lo script sopra crea il database della scuola. Nel database, creiamo la tabella Studenti con quattro colonne, come Id, StudentName, Course e Score. Infine, aggiungiamo i quattro record fittizi alla tabella Studenti.

Ora, se utilizzi un'istruzione SELECT per recuperare tutti i record, vedrai quanto segue:

Rendiamo PIVOT questa tabella per la colonna Corso. Per fare ciò, esegui il seguente script:

SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot

Vediamo cosa sta succedendo nella sceneggiatura. Nella prima riga, utilizziamo l'istruzione SELECT per definire le colonne che vogliamo aggiungere alla tabella pivot. Le prime due colonne sono StudentName e Score. I dati per queste due colonne proverranno direttamente dalla tabella Studenti. La terza colonna è Corso. Vogliamo PIVOTare la nostra tabella in base alla colonna Corso, quindi la colonna Corso sarà suddivisa nel numero di colonne pari ai valori specificati dall'operatore PIVOT per la colonna Corso.

La sintassi per l'operatore PIVOT è semplice. Innanzitutto, devi applicare una funzione di aggregazione alla colonna i cui valori desideri visualizzare nelle colonne pivot. Nel nostro caso, vogliamo mostrare il punteggio nelle colonne pivot:inglese e storia. Infine, utilizziamo un'istruzione FOR per specificare la colonna pivot ei valori univoci in essa contenuti. Il risultato è simile al seguente:

Operatore UNPIVOT

L'operatore UNPIVOT viene utilizzato per convertire le colonne della tabella in righe. Ad esempio, se hai una tabella simile a questa:

L'operatore UNPIVOT restituirà i seguenti risultati:

Le colonne della tabella originale sono state convertite nelle righe della tabella non pivot. Usiamo questi dati per vedere come funziona l'operatore UNPIVOT in SQL.

Per fare ciò, esegui il seguente 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 selezioni i dati dalla tabella Studenti del database School2, vedrai i seguenti risultati:

Per applicare l'operatore UNPIVOT a questa tabella, eseguire la query seguente:

SELECT StudentName, Course, Score
FROM Students
UNPIVOT
(
	Score
	FOR Course in (Math, English, History, Science)
) AS SchoolUnpivot

La sintassi per l'operatore UNPIVOT è simile a quella PIVOT. Nell'istruzione SELECT è necessario specificare le colonne che si desidera aggiungere alla tabella di output. Nell'istruzione UNPIVOT, specificherai due colonne:

  1. La prima colonna contiene i valori delle righe delle colonne pivot (che in questo caso è Punteggio).
  2. La seconda colonna include i nomi delle colonne pivot, ovvero matematica, inglese, storia e scienze.

La tabella di output sarà simile a questa:

Inversione di un PIVOT

L'inversione di un operatore PIVOT si riferisce al processo di applicazione dell'operatore UNPIVOT a una tabella pivot per tornare alla tabella originale.

Inversione della tabella pivot non aggregata

L'inversione di un operatore PIVOT è possibile solo se la tabella pivot non contiene dati aggregati.

Diamo un'occhiata alla tabella che abbiamo utilizzato nella sezione PIVOT di questo articolo.

Puoi vedere che non ci sono righe ripetute. In altre parole, possiamo dire che per ogni studente c'è un solo record per corso. Ad esempio, Sally ha un solo record per il suo punteggio nel corso di inglese.

Quando abbiamo applicato l'operatore PIVOT alla tabella sopra, abbiamo ottenuto il seguente risultato:

Ora applicheremo l'operatore UNPIVOT a questo risultato e vedremo se possiamo tornare alla tabella originale. Per fare ciò, esegui il seguente script:

Nota:

Possiamo eseguire questa query sul database della scuola che abbiamo creato nella sezione dell'operatore 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

Qui utilizziamo una sottoquery per applicare l'operatore UNPIVOT ai dati pivot. La query interna utilizza l'operatore PIVOT, mentre la query esterna utilizza l'operatore UNPIVOT. All'output, vedrai la tabella Studenti originale.

Inversione della tabella pivot aggregata

Abbiamo detto in precedenza che è possibile solo invertire un operatore PIVOT che non contiene dati aggregati. Proviamo a invertire l'istruzione PIVOT che contiene dati aggregati.

Aggiungi un altro record alla tabella Studenti del database School che abbiamo creato nella prima sezione di questo articolo. Per fare ciò, esegui la seguente query:

INSERT INTO Students VALUES ('Edward', 'History', 78)

Ora, se selezioni tutti i record dalla tabella Studenti, otterrai il seguente output:

Possiamo vedere che abbiamo un record duplicato per il punteggio di Edward nella storia.

Ora applica l'operatore PIVOT a questa tabella.

SELECT Id, StudentName, English, History
FROM Students
PIVOT
(
	SUM (Score)
	FOR Course in (English, History)
) AS Schoolpivot

Dall'output, puoi vedere che la funzione SOMMA nell'operatore PIVOT ha aggiunto due punteggi al corso di Storia seguito da Edward. Se provi a invertire il pivot di questa tabella (cioè applica l'operatore UNPIVOT), non riceverai la tabella originale. Restituirà i quattro record invece dei cinque originali. La colonna Cronologia per lo studente Edward conterrà il risultato aggregato anziché i singoli risultati.

Per vederlo, esegui il seguente 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

La tabella di output sarà simile a questa:

Riferimenti:

  • Microsoft:utilizzo di PIVOT e UNPIVOT
  • Codingsight:utilizzo di PIVOT in SQL
  • YouTube:video PIVOT inverso