sql >> Databáze >  >> RDS >> Database

Pochopení příkazů PIVOT, UNPIVOT a Reverse PIVOT

Příkaz PIVOT se používá k převodu řádků tabulky na sloupce, zatímco operátor UNPIVOT převádí sloupce zpět na řádky. Stornování příkazu PIVOT odkazuje na proces aplikace operátoru UNPIVOT na již PIVOTED datovou sadu za účelem získání původní datové sady.

V tomto článku budeme studovat tyto tři koncepty na různých příkladech.

Operátor PIVOT

Jak již bylo zmíněno dříve, operátor PIVOT převádí řádky tabulky na sloupce. Pokud máte například tabulku, která vypadá takto:

a otočte jej o třetí sloupec, výsledek bude následující:

V původní tabulce jsme měli dvě jedinečné hodnoty pro sloupce Kurz – Angličtina a Historie. V kontingenční tabulce byly tyto jedinečné hodnoty převedeny na sloupce. Můžete vidět, že hodnoty skóre pro každý nový sloupec zůstávají nezměněny. Například v původní tabulce měla studentka Sally skóre 95 v angličtině, na rozdíl od hodnot v otočné tabulce.

Jako vždy se ujistěte, že před provedením jakýchkoli úprav v živé databázi provedete bezpečnou zálohu.

Podívejme se na tento příklad použití operátoru PIVOT v 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)

Výše uvedený skript vytvoří školní databázi. V databázi vytvoříme tabulku Studenti se čtyřmi sloupci, jako jsou Id, StudentName, Course a Score. Nakonec přidáme čtyři fiktivní záznamy do tabulky Studenti.

Nyní, pokud použijete příkaz SELECT k načtení všech záznamů, uvidíte následující:

Udělejme PIVOT tuto tabulku podle sloupce Kurz. Chcete-li to provést, spusťte následující skript:

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

Podívejme se, co se děje ve scénáři. V prvním řádku pomocí příkazu SELECT definujeme sloupce, které chceme přidat do kontingenční tabulky. První dva sloupce jsou Jméno studenta a Skóre. Data pro tyto dva sloupce pocházejí přímo z tabulky Studenti. Třetí sloupec je Kurz. Chceme naši tabulku PIVOTOVAT podle sloupce Kurz, proto bude sloupec Kurz rozdělen na počet sloupců rovný hodnotám určeným operátorem PIVOT pro sloupec Kurz.

Syntaxe operátoru PIVOT je jednoduchá. Nejprve musíte použít agregační funkci na sloupec, jehož hodnoty chcete zobrazit v otočných sloupcích. V našem případě chceme skóre zobrazovat v otočných sloupcích – Angličtina a Historie. Nakonec pomocí příkazu FOR specifikujeme sloupec pivotu a jedinečné hodnoty v něm. Výsledek vypadá takto:

Operátor UNPIVOT

Operátor UNPIVOT se používá k převodu sloupců tabulky na řádky. Pokud máte například tabulku, která vypadá takto:

Operátor UNPIVOT vrátí následující výsledky:

Sloupce původní tabulky byly převedeny na řádky v neotočné tabulce. Použijme tato data, abychom viděli, jak funguje operátor UNPIVOT v SQL.

Chcete-li to provést, spusťte následující 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)

Pokud vyberete data z tabulky Studenti databáze School2, uvidíte následující výsledky:

Chcete-li na tuto tabulku použít operátor UNPIVOT, spusťte následující dotaz:

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

Syntaxe operátoru UNPIVOT je podobná jako u PIVOT. V příkazu SELECT musíte zadat sloupce, které chcete přidat do výstupní tabulky. V příkazu UNPIVOT zadáte dva sloupce:

  1. První sloupec obsahuje hodnoty z řádků otočných sloupců (což je v tomto případě Skóre).
  2. Druhý sloupec obsahuje názvy otočných sloupců, tj. Matematika, Angličtina, Historie a Věda.

Výstupní tabulka bude vypadat takto:

Změna PIVOTu

Obrácení operátoru PIVOT se týká procesu použití operátoru UNPIVOT na pivotovanou tabulku, aby se člověk vrátil k původní tabulce.

Obrácení neagregované kontingenční tabulky

Obrácení operátoru PIVOT je možné pouze v případě, že kontingenční tabulka neobsahuje agregovaná data.

Podívejme se na tabulku, kterou jsme použili v části PIVOT tohoto článku.

Můžete vidět, že neexistují žádné opakované řádky. Jinými slovy, můžeme říci, že pro každého studenta existuje pouze jeden záznam na kurz. Například Sally má pouze jeden rekord za své skóre v kurzu angličtiny.

Když jsme použili operátor PIVOT na výše uvedenou tabulku, dostali jsme následující výsledek:

Nyní na tento výsledek použijeme operátor UNPIVOT a uvidíme, zda se můžeme vrátit k původní tabulce. Chcete-li to provést, spusťte následující skript:

Poznámka:

Tento dotaz můžeme provést na školní databázi, kterou jsme vytvořili v sekci PIVOT operátor.

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

Zde používáme poddotaz k aplikaci operátoru UNPIVOT na pivotovaná data. Vnitřní dotaz používá operátor PIVOT, zatímco vnější dotaz používá operátor UNPIVOT. Na výstupu uvidíte původní tabulku Students.

Změna agregované kontingenční tabulky

Již dříve jsme řekli, že je možné obrátit pouze operátor PIVOT, který neobsahuje agregovaná data. Zkusme obrátit příkaz PIVOT, který obsahuje agregovaná data.

Přidejte další záznam do tabulky Studenti školní databáze, kterou jsme vytvořili v první části tohoto článku. Chcete-li to provést, spusťte následující dotaz:

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

Pokud nyní vyberete všechny záznamy z tabulky Studenti, získáte následující výstup:

Vidíme, že máme duplicitní záznam Edwardova partitury v historii.

Nyní na tuto tabulku použijte operátor PIVOT.

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

Z výstupu můžete vidět, že funkce SUM v operátoru PIVOT přidala dvě skóre do kurzu Historie, který absolvoval Edward. Pokud se pokusíte obrátit pivot této tabulky (tj. použít operátor UNPIVOT), neobdržíte původní tabulku. Vrátí čtyři záznamy místo původních pěti. Sloupec Historie pro studenta Edwarda bude obsahovat agregovaný výsledek, nikoli jednotlivé výsledky.

Chcete-li to zobrazit, spusťte následující 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

Výstupní tabulka bude vypadat takto:

Odkazy:

  • Microsoft:Použití PIVOT a UNPIVOT
  • Codingsight:Použití PIVOT v SQL
  • YouTube:Reverzní PIVOT video

  1. Chování NOT LIKE s hodnotami NULL

  2. Přidejte Ordinal Indicator k datu v PostgreSQL

  3. Postgres - poslední verze 0.14.0 drahokamu pg hlásí chybu

  4. Jak mohu seskupit podle sloupce data a času, aniž bych vzal v úvahu čas