OD – Používání PIVOT a UNPIVOT
- 10/14/2019
- 5 minut na čtení
-
- V
- c
- M
- i
- M
-
+7
Platí pro: SQL Server (všechny podporované verze) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallel Data Warehouse
Můžete použít relační operátory PIVOT
a UNPIVOT
změnit výraz s hodnotou tabulky na jinou tabulku. PIVOT
otočí výraz s hodnotou tabulky otočením jedinečných hodnot z jednoho sloupce ve výrazu do více sloupců na výstupu. A PIVOT
spouští agregace, kde jsou požadovány u všech zbývajících hodnot sloupců, které jsou požadovány v konečném výstupu. UNPIVOT
provádí opačnou operaci na PIVOT otáčením sloupců výrazu s hodnotami v tabulce do hodnot sloupců.
Syntaxe pro PIVOT
poskytuje je jednodušší a čitelnější než syntaxe, která by jinak mohla být uvedeno v komplexní řadě SELECT...CASE
prohlášení. Úplný popis syntaxe pro PIVOT
najdete v části FROM (Transact-SQL).
Syntaxe
Následující syntaxe shrnuje, jak používat operátor PIVOT
.
Poznámky
Identifikátory sloupců v klauzuli UNPIVOT
sledují řazení katalogu. U SQL Database je řazení vždy SQL_Latin1_General_CP1_CI_AS
. U serveru SQL Server částečně obsažen databází je řazení vždy Latin1_General_100_CI_AS_KS_WS_SC
. Pokud je sloupec kombinován ed s jinými sloupci, pak je vyžadována klauzule kompletování (COLLATE DATABASE_DEFAULT
), aby nedocházelo ke konfliktům.
Základní příklad PIVOT
Následující příklad kódu vytvoří dvousloupcovou tabulku se čtyřmi řádky.
Zde je sada výsledků.
Se třemi produkty nejsou definovány žádné produkty DaysToManufacture
.
Následující kód zobrazí stejný výsledek, otočený tak, že DaysToManufacture
hodnoty se stanou záhlavími sloupců. K dispozici je sloupec na tři dny, přestože výsledky jsou
NULL
.
Zde je sada výsledků .
Složitý příklad PIVOT
Běžný scénář, kde může být užitečný PIVOT
, když chcete generovat výkazy mezi tabulkami a poskytnout souhrn údajů. Předpokládejme například, že chcete dotazovat PurchaseOrderHeader
tabulku v AdventureWorks2014
vzorové databázi a určit počet objednávek zadaných určitými zaměstnanci. Následující dotaz poskytuje tento přehled seřazený podle dodavatele.
Zde je částečná sada výsledků.
Výsledky vrácené tímto dílčím výběrem příkaz je otočen ve sloupci EmployeeID
.
Jedinečné hodnoty vrácené EmployeeID
sloupec se stane poli v sadě konečných výsledků. Jako takový existuje „sa sloupec pro každé EmployeeID
číslo uvedené v kontingenční klauzuli: v tomto případě zaměstnanci 250
, 251
, 256
, 257
a 260
. sloupec div id = „c36dcf6b3b“>
slouží jako sloupec hodnoty, proti kterému jsou seskupeny sloupce vrácené v konečném výstupu, které se nazývají seskupovací sloupce. V tomto případě jsou seskupovací sloupce agregovány pomocí COUNT
. Všimněte si, že se zobrazí varovná zpráva, která naznačuje, že při výpočtu PurchaseOrderID
sloupce PurchaseOrderID
nebyly brány v úvahu id = „fccf2035df“>
pro každého zaměstnance.
Důležité
Při použití agregačních funkcí s PIVOT
, při výpočtu agregace není zohledněna přítomnost žádných hodnot null ve sloupci hodnot.
Příklad UNPIVOT
UNPIVOT
provádí téměř obrácenou operaci PIVOT
otáčením sloupců do řádků. Předpokládejme, že tabulka vytvořená v předchozím příkladu je uložena v databázi jako pvt
a chcete otočit identifikátory sloupců Emp1
, Emp2
, Emp3
, Emp4
a Emp5
do řádkových hodnot, které odpovídají konkrétnímu dodavateli. Jako takový musíte identifikovat dva další sloupce.Sloupec, který bude obsahovat hodnoty sloupců, které „otáčíte (Emp1
, Emp2
, …), se bude jmenovat Employee
a sloupec, který bude obsahovat hodnoty, které aktuálně existují pod rotovanými sloupci, se bude jmenovat Orders
. Tyto sloupce odpovídají pivot_column a value_column v definici Transact-SQL. Zde je dotaz.
Zde je částečná sada výsledků.
Všimněte si, že UNPIVOT
není přesný opak PIVOT
. PIVOT
provede agregaci a na výstupu sloučí možné více řádků do jednoho řádku. UNPIVOT
nereprodukuje původní výsledek výrazu s tabulkovou hodnotou, protože byly sloučeny řádky. Také zmizí nulové hodnoty ve vstupu UNPIVOT
Když hodnoty zmizí, ukazuje to, že na vstupu před operací PIVOT
mohly být původní nulové hodnoty.
Sales.vSalesPersonSalesByFiscalYears
zobrazení v ukázkové databázi AdventureWorks2012 používá PIVOT
k vrácení celkového prodeje pro každého prodejce za každý fiskální rok. Skriptování zobrazení v SQL Server Management Studio , v Průzkumníku objektů vyhledejte pohled ve složce Pohledy pro databázi AdventureWorks2012. Klepněte pravým tlačítkem na název pohledu a poté vyberte Pohled skriptu jako.
Viz také
FROM (Transact -SQL)
PŘÍPAD (Transact-SQL)