Relační databáze ukládají obrovské množství dat ve formě tabulek. Tyto tabulky mohou mít libovolný počet řádků a sloupců. Ale co kdybyste museli změnit data na úrovni řádků na sloupcová data? V tomto článku o SQL Pivot vám ukážu, jak můžete převést řádky na sloupec na serveru SQL.
Tento článek se bude zabývat následujícími tématy:
- Co je PIVOT v SQL?
- Syntaxe
- Příklad
- Fungování doložky PIVOT
- SQL UNPIVOT
Co je PIVOT v SQL?
PIVOT se používá k otočení hodnoty tabulky převodem jedinečných hodnot jednoho sloupce na více sloupců. Používá se k otočení řádků na hodnoty sloupců a v případě potřeby spouští agregace na zbývajících hodnotách sloupců.
UNPIVOT se na druhé straně používá k provádění opačných operací. Používá se tedy k převodu sloupců konkrétní tabulky na hodnoty sloupců.
V tomto článku budeme pokračovat, abychom pochopili syntaxi SQL Pivot.
Syntaxe:
SELECT NonPivoted ColumnName, [First Pivoted ColumnName] AS ColumnName, [Second Pivoted ColumnName] AS ColumnName, [Third Pivoted ColumnName] AS ColumnName, ... [Last Pivoted ColumnName] AS ColumnName FROM (SELECT query which produces the data) AS [alias for the initial query] PIVOT ( [AggregationFunction](ColumName) FOR [ColumnName of the column whose values will become column headers] IN ( [First Pivoted ColumnName], [Second Pivoted ColumnName], [Third Pivoted ColumnName] ... [last pivoted column]) ) AS [alias for the Pivot Table];
Zde můžete také použít klauzuli ORDER BY k seřazení hodnot ve vzestupném nebo sestupném pořadí. Nyní, když víte, co je PIVOT v SQL a jeho základní syntaxi, pojďme se posunout vpřed a uvidíme, jak jej používat.
Příklady
Pro vaše lepší pochopení vysvětlím všechny příklady pomocí následující tabulky.
Tabulka dodavatelů:
ID dodavatele | Dny výroby | Cena | Číslo zákazníka | ID nákupu |
1 | 12 | 1230 | 11 | P1 |
2 | 21 | 1543 | 22 | P2 |
3 | 32 | 2345 | 11 | P3 |
4 | 14 | 8765 | 22 | P1 |
5 | 42 | 3452 | 33 | P3 |
6 | 31 | 5431 | 33 | P1 |
7 | 41 | 2342 | 11 | P2 |
8 | 54 | 3654 | 22 | P2 |
9 | 33 | 1234 | 11 | P3 |
10 | 56 | 6832 | 33 | P2 |
Pojďme napsat jednoduchý dotaz, abychom získali průměrné náklady vynaložené každým zákazníkem.
SELECT CustomerID, AVG(Cost) AS AverageCostofCustomer FROM Suppliers GROUP BY CustomerID;
Výstup:
Číslo zákazníka | Průměrné náklady zákazníka |
11 | 1787,75 |
22 | 4654 |
33 | 5238,33 |
Nyní řekněme, že chceme otočit výše uvedenou tabulku. Zde se hodnoty sloupce CustomerID stanou záhlavími sloupců.
-- Create Pivot table with one row and three columns SELECT 'AverageCostofCustomer' AS Cost_According_To_Customers, [11], [22], [33] FROM (SELECT CustomerID, Cost FROM Suppliers) AS SourceTable PIVOT ( AVG(Cost) FOR CustomerID IN ([11], [22], [33]) ) AS PivotTable;
Výstup:
Cost_According_To_Customers | 11 | 22 | 33 |
Průměrné náklady zákazníka | 1787,75 | 4654 | 5238,33 |
Poznámka: Když používáte agregační funkce s PIVOT, hodnoty null se při výpočtu agregace neberou v úvahu.
To byl základní příklad, ale nyní pochopíme, jak fungovala klauzule PIVOT.
Fungování klauzule PIVOT
Jak můžete vidět výše, pro vytvoření PIVOT TABULKY musíte postupovat podle následujících kroků:
- Vyberte sloupce pro otáčení
- Potom vyberte zdrojovou tabulku.
- Použijte operátor PIVOT a poté použijte agregační funkce.
- Uveďte klíčové hodnoty.
Vyberte sloupce pro otočení
Zpočátku musíme specifikovat pole, která budou zahrnuta do našich výsledků. V našem příkladu jsem uvažoval sloupec Průměrná cena zákazníka v kontingenční tabulce. Poté jsme vytvořili tři další sloupce se záhlavími sloupců 11, 22 a 33. Příklad-
SELECT 'AverageCostofCustomer' AS Cost_According_To_Customers, [11], [22], [33]
Vyberte zdrojovou tabulku
Dále musíte zadat příkaz SELECT, který vrátí zdrojová data pro kontingenční tabulku. V našem příkladu vracíme CustomerID a Cost z tabulky Dodavatelé.
(SELECT CustomerID, Cost FROM Suppliers) AS SourceTable
Použijte operátor PIVOT a poté použijte agregační funkce
Dále musíte určit agregační funkci, která se má použít při vytváření kontingenční tabulky. V našem příkladu jsem pro výpočet průměrných nákladů použil funkci AVG.
PIVOT ( AVG(Cost)
Uveďte klíčové hodnoty
Nakonec musíte zmínit hodnoty, které musí být zahrnuty do výsledné kontingenční tabulky. Tyto hodnoty budou použity jako záhlaví sloupců v kontingenční tabulce.
FOR CustomerID IN ([11], [22], [33]) ) AS PivotTable;
Takto fungují operátoři PIVOT. V tomto článku o SQL PIVOT dále pochopme, jak se liší od SQL UNPIVOT.
SQL UNPIVOT
Operátor SQL UNPIVOT se používá k provedení opačné operace, než je operace PIVOT. Používá se k rotaci dat sloupců na data na úrovni řádků. Syntaxe UNPIVOT je podobná syntaxi PIVOT. Jediný rozdíl je v tom, že musíte použít klíčové slovo SQL „UNPIVOT“ .
Příklad:
Vytvořme tabulku se sloupci SupplierID, AAA, BBB a CCC. Vložte také několik hodnot.
CREATE TABLE sampletable (SupplierID int, AAA int, BBB int, CCC int); GO INSERT INTO sampletable VALUES (1,3,5,6); INSERT INTO sampletable VALUES (2,9,2,8); INSERT INTO sampletable VALUES (3,8,1,7); GO
Výstup:
ID dodavatele | AAA | BBB | CCC |
1 | 3 | 5 | 6 |
2 | 9 | 2 | 8 |
3 | 8 | 1 | 7 |
Nyní, řekněme, chceme odklopit tabulku. Chcete-li to provést, můžete použít následující kód:
SELECT SupplierID, Customers, Products FROM (SELECT SupplierD, AAA, BBB, CCC FROM sampletable) p UNPIVOT (Products FOR Customers IN (AAA, BBB, CCC) )AS example; GO
ID dodavatele | Zákazníci | Produkty |
1 | AAA | 3 |
1 | BBB | 5 |
1 | CCC | 6 |
2 | AAA | 9 |
2 | BBB | 2 |
2 | CCC | 8 |
3 | AAA | 8 |
3 | BBB | 1 |
3 | CCC | 7 |
Takto můžete použít SQL PIVOT a UNPIVOT. Tímto se dostáváme ke konci tohoto článku. Doufám, že jste pochopili, jak používat SQL. Pokud se chcete dozvědět více o MySQL a seznámit se s touto relační databází s otevřeným zdrojovým kódem, podívejte se na naše certifikační školení MySQL DBA který přichází s instruktorem vedeným živým školením a reálnými zkušenostmi z projektů. Toto školení vám pomůže porozumět MySQL do hloubky a pomůže vám dosáhnout zvládnutí tohoto předmětu.
Máte na nás otázku? Zmiňte to prosím v sekci komentářů k tomuto článku o SQL Pivot a já se vám ozvu.