sql >> Databasteknik >  >> RDS >> Database

Förstå PIVOT-, UNPIVOT- och Reverse PIVOT-satser

PIVOT-satsen används för att konvertera tabellrader till kolumner, medan UNPIVOT-operatorn konverterar kolumner tillbaka till rader. Att vända en PIVOT-sats hänvisar till processen att applicera UNPIVOT-operatorn på den redan PIVOTED-datauppsättningen för att hämta den ursprungliga datauppsättningen.

I den här artikeln kommer vi att studera dessa tre begrepp på olika exempel.

PIVOT-operatör

Som nämnts tidigare konverterar PIVOT-operatorn tabellrader till kolumner. Till exempel, om du har en tabell som ser ut så här:

och vrid den vid den tredje kolumnen, blir resultatet som följer:

I den ursprungliga tabellen hade vi två unika värden för kurskolumnerna – engelska och Historia. I den pivoterade tabellen har dessa unika värden konverterats till kolumner. Du kan se att poängvärdena för varje ny kolumn förblir oförändrade. Till exempel, i den ursprungliga tabellen, hade en elev, Sally, fått 95 på engelska, till skillnad från värdena i den pivoterade tabellen.

Se alltid till att du gör en säker säkerhetskopia innan du gör några justeringar av en livedatabas.

Låt oss titta på detta exempel på att använda PIVOT-operatorn i 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)

Skriptet ovan skapar skoldatabasen. I databasen skapar vi tabellen Studenter med fyra kolumner, såsom Id, StudentName, Course och Score. Slutligen lägger vi till de fyra dummyposterna i tabellen Studenter.

Nu, om du använder en SELECT-sats för att hämta alla poster, kommer du att se följande:

Låt oss PIVOTERA den här tabellen efter kolumnen Kurs. För att göra detta, kör följande skript:

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

Låt oss se vad som händer i manuset. På den första raden använder vi SELECT-satsen för att definiera de kolumner som vi vill lägga till i den pivoterade tabellen. De två första kolumnerna är Studentnamn och Betyg. Data för dessa två kolumner kommer direkt från tabellen Studenter. Den tredje kolumnen är Kurs. Vi vill PIVOTERA vår tabell efter kurskolumnen, därför kommer kurskolumnen att delas upp i antalet kolumner lika med värdena som specificeras av PIVOT-operatorn för kurskolumnen.

Syntaxen för PIVOT-operatorn är enkel. Först måste du tillämpa en aggregatfunktion på kolumnen vars värden du vill visa i de pivoterade kolumnerna. I vårt fall vill vi visa Score i de pivoterade kolumnerna – Engelska och Historia. Slutligen använder vi en FOR-sats för att specificera pivotkolumnen och de unika värdena i den. Resultatet ser ut så här:

UNPIVOT-operatör

UNPIVOT-operatorn används för att konvertera tabellkolumner till rader. Till exempel, om du har en tabell som ser ut så här:

UNPIVOT-operatören returnerar följande resultat:

Kolumnerna i den ursprungliga tabellen har konverterats till raderna i den opivoterade tabellen. Låt oss använda dessa data för att se hur UNPIVOT-operatören fungerar i SQL.

För att göra detta, kör följande skript:

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)

Om du väljer data från Elevtabellen i School2-databasen kommer du att se följande resultat:

För att tillämpa UNPIVOT-operatorn på den här tabellen, kör följande fråga:

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

Syntaxen för UNPIVOT-operatorn liknar PIVOT-operatorn. I SELECT-satsen måste du ange de kolumner du vill lägga till i utdatatabellen. I UNPIVOT-satsen kommer du att ange två kolumner:

  1. Den första kolumnen innehåller värdena från raderna i de pivoterade kolumnerna (vilket är Score i det här fallet).
  2. Den andra kolumnen innehåller namnen på de pivoterade kolumnerna, t.ex. matematik, engelska, historia och naturvetenskap.

Utdatatabellen kommer att se ut så här:

Vända en PIVOT

Omvända en PIVOT-operator avser processen att applicera UNPIVOT-operatorn på en pivoterad tabell för att återgå till den ursprungliga tabellen.

Reverserande icke-aggregerad pivoterad tabell

Att vända en PIVOT-operator är endast möjligt om den pivoterade tabellen inte innehåller aggregerad data.

Låt oss titta på tabellen vi använde i PIVOT-avsnittet i den här artikeln.

Du kan se att det inte finns några upprepade rader. Med andra ord kan vi säga att det för varje elev bara finns en post per kurs. Till exempel har Sally bara ett rekord för sina poäng i engelskakursen.

När vi använde PIVOT-operatorn på tabellen ovan fick vi följande resultat:

Nu ska vi tillämpa UNPIVOT-operatorn på detta resultat och se om vi kan gå tillbaka till den ursprungliga tabellen. För att göra detta, kör följande skript:

Obs!

Vi kan köra denna fråga på skolans databas som vi skapade i PIVOT-operatörssektionen.

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

Här använder vi en underfråga för att applicera UNPIVOT-operatorn på pivoterade data. Den inre frågan använder PIVOT-operatorn, medan den yttre frågan använder UNPIVOT-operatorn. Vid utgången ser du den ursprungliga elevtabellen.

Reversering av aggregerad pivoterad tabell

Vi sa tidigare att det bara är möjligt att vända en PIVOT-operatör som inte innehåller aggregerad data. Låt oss försöka vända PIVOT-satsen som innehåller aggregerad data.

Lägg till ytterligare en post i tabellen Studenter i skoldatabasen som vi skapade i det första avsnittet i den här artikeln. För att göra detta, kör följande fråga:

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

Om du nu väljer alla poster från tabellen Studenter får du följande utdata:

Vi kan se att vi har ett dubblerat rekord för Edwards poäng i historia.

Använd nu PIVOT-operatorn på den här tabellen.

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

Från utgången kan du se att SUM-funktionen i PIVOT-operatorn har lagt till två poäng till Historiekursen som Edward tagit. Om du försöker vända pivoten för denna tabell (dvs. tillämpa UNPIVOT-operatorn), kommer du inte att få den ursprungliga tabellen. Det kommer att returnera de fyra skivorna istället för de ursprungliga fem. Kolumnen Historik för studenten Edward kommer att innehålla det aggregerade resultatet snarare än de individuella resultaten.

För att se detta, kör följande skript:

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

Utdatatabellen kommer att se ut så här:

Referenser:

  • Microsoft:Använder PIVOT och UNPIVOT
  • Codingsight:Använder PIVOT i SQL
  • YouTube:Omvänd PIVOT-video

  1. Kopiera tabeller från en databas till en annan i SQL Server

  2. SQLSTATE[HY000] [2002] Ett anslutningsförsök misslyckades.. - Vid försök att ansluta från lokal till fjärrserver

  3. GroupingError:ERROR:kolumnen måste visas i GROUP BY-satsen eller användas i en aggregerad funktion

  4. Ormlite eller sqlite Vilken är bra för Android-perspektiv?