sql >> Database >  >> RDS >> Database

Pivot-operator in SQL begrijpen

De pivot-operator in SQL Server converteert elke rij in de geaggregeerde resultatenset naar overeenkomstige kolommen in de uitvoerset. De pivot-operator is vooral handig bij het schrijven van kruistabelquery's.

Laten we eens kijken hoe het in de praktijk werkt.

De gegevens voorbereiden

Laten we eerst wat dummy-gegevens maken die we vervolgens kunnen gebruiken om de pivot-operator te implementeren.

CREATE DATABASE schooldb
					
CREATE TABLE student
(
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender VARCHAR(50) NOT NULL,
    DOB datetime NOT NULL,
    total_score INT NOT NULL,
    city VARCHAR(50) NOT NULL
 )

INSERT INTO student

VALUES (1, 'Jolly', 'Female', '12-JUN-1989', 500, 'London'), 
(2, 'Jon', 'Male', '02-FEB-1974', 545, 'Manchester'), 
(3, 'Sara', 'Female', '07-MAR-1988', 600, 'Leeds'), 
(4, 'Laura', 'Female', '22-DEC-1981', 400, 'Liverpool'), 
(5, 'Alan', 'Male', '29-JUL-1993', 500, 'London'), 
(6, 'Kate', 'Female', '03-JAN-1985', 500, 'Liverpool'), 
(7, 'Joseph', 'Male', '09-APR-1982', 643, 'London'), 
(8, 'Mice', 'Male', '16-AUG-1974', 543, 'Liverpool'), 
(9, 'Wise', 'Male', '11-NOV-1987', 499, 'Manchester'), 
(10, 'Elis', 'Female', '28-OCT-1990', 400, 'Leeds');

Hoe werkt de draaioperator?

De standaardmanier om SQL-gegevens te groeperen is met behulp van de Group By-clausule. Laten we een query maken die het gemiddelde berekent van de waarden in de kolom total_score van de studententabel, gegroepeerd op stad.

USE schooldb

SELECT 
	city,
	AVG(total_score) as Avg_Score
FROM 
	student
GROUP BY
	city

Dit geeft het volgende resultaat:

[tabel id=25 /]

Wat als we een resultatenset willen waarin de stadsnamen worden weergegeven in kolommen waarin elke kolom de gemiddelde waarde bevat van de totale_score van de studenten die tot die stad behoren? Zoiets als dit:

[tabel id=26 /]

Dit is waar de pivot-operator van pas komt.

De basisgegevens selecteren

De eerste stap bij het gebruik van de pivot-operator is het selecteren van de basisgegevens waarop de pivot-operator zal worden gebaseerd. We willen onze gegevens per stad groeperen en het gemiddelde vinden van de totale_score van de studenten die tot die stad behoren. Daarom moeten we een eenvoudige SELECT-instructie schrijven die de stad en de totale_score selecteert.

SELECT 
	city,
	total_score
FROM 
	student

Een tijdelijke dataset maken

Nu zouden we idealiter de pivot-operator rechtstreeks kunnen toepassen op de basisgegevens die we in de vorige sectie hebben gemaakt, maar helaas kunnen we dat niet. Om de pivot-operator te laten werken, moeten we een tabelwaarde-expressie maken waarop we de pivot-operator kunnen toepassen. We hebben hier een verscheidenheid aan keuzes; we zouden afgeleide tabellen, gemeenschappelijke tabeluitdrukkingen (CTE's) kunnen gebruiken of we zouden zelfs tijdelijke tabellen kunnen maken.

Voor dit voorbeeld gebruiken we een snelle, eenvoudige afgeleide tabel. Om dat te doen met de basis select-instructie die we in de laatste sectie hebben gemaakt, plaatsen we deze tussen haakjes en passen er vervolgens een alias op toe. Ten slotte selecteren we alles uit die afgeleide tabel.

SELECT * FROM

(SELECT 
	city,
	total_score
FROM 
	student
)
AS StudentTable

De Pivot Operator toepassen

Nu we onze basisgegevens hebben voorbereid en een afgeleide tabel hebben gemaakt, gaan we er de pivot-operator op toepassen.

Om dit te doen, voegt u "PIVOT" toe aan het einde van de afgeleide tabel, gevolgd door een set haakjes, en geeft u deze draaitabel een alias.

Binnen de haakjes moeten we enkele belangrijke informatie specificeren.

  1. We moeten het veld specificeren waarop we een aggregatiefunctie willen toepassen. In ons geval willen we de AVG-aggregatiefunctie toepassen in de kolom "total_score".
  2. We moeten dan zeggen naar welke kolommen van de basisgegevens we onze gegevens draaien. We doen dit door "FOR" te schrijven, gevolgd door de kolomnaam, wat in ons voorbeeld een stad is.
  3. De laatste stap is een beetje irritant. We moeten de waarden uit de stadskolom vermelden die we koppen willen worden in onze draaitabel. We gebruiken de IN-operator gevolgd door een reeks haakjes. Binnen de haakjes gebruiken we een door komma's gescheiden lijst waarin we de naam van elke kolom tussen vierkante haakjes schrijven. In ons voorbeeld willen we Londen, Leeds en Manchester als kopnamen van de draaitabel en daarom schrijven we ze in dit formaat:([London], [Leeds], [Manchester]).
USE schooldb

SELECT * FROM

(SELECT 
	city,
	total_score
FROM 
	student
)
AS StudentTable
PIVOT(
	AVG(total_score)
	FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable

Als u de bovenstaande zoekopdracht uitvoert, zien de resultaten er als volgt uit:

[tabel id=27 /]

Rijgroepen toevoegen in draaitabel

In de vorige secties hebben we gezien hoe rijgroepen kunnen worden omgezet in kolomgroepen met behulp van de pivot-operator. U kunt echter ook rijgroepen en kolomgroepen toevoegen aan een draaitabel.

Als u bijvoorbeeld de gemiddelde waarde wilt vinden van de kolom 'total_score' van alle studenten, gegroepeerd op stad en op geslacht, kunt u de kolomgroep en de rijgroep in combinatie gebruiken in een draaitabel. Hier staat elke kolom voor een plaatsnaam en elke rij voor het geslacht van een leerling.

Gelukkig hoef je geen extra script te schrijven om rijgroepen aan een draaitabel toe te voegen. Voeg in de basisgegevensset eenvoudig de kolomnaam toe die u als rijgroep aan de draaitabel wilt toevoegen.

USE schooldb

SELECT * FROM

(SELECT 
	city,
	gender,
	total_score
FROM 
	student
)
AS StudentTable
PIVOT(
	AVG(total_score)
	FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable

In het bovenstaande script hebben we eenvoudigweg de kolom 'geslacht' toegevoegd aan de basis SELECT-instructie.

De uitvoer van de bovenstaande query ziet er als volgt uit:

[tabel id=28 /]

Dit is kruistabel. Uit de resultaten blijkt bijvoorbeeld dat de gemiddelde totale_score van vrouwelijke studenten die in Londen wonen 500 is. Evenzo is de gemiddelde totale score van mannelijke studenten die in Londen wonen 571.

Lees ook:

Dynamische draaitabel maken met QUOTENAME-functie


  1. Hoe json-array naar tekstarray te casten?

  2. Hoe Oracle MD5 hash-functie aan te roepen?

  3. Hoe datetime naar UTC te converteren in MySQL

  4. Kan geen verbinding maken met server - Een netwerkgerelateerde of instantiespecifieke fout