SQLShack

V tomto článku, budeme chodit přes SQL Pivot a SQL Unpivot operátorů, a jak mohou být užitečné provést SQL Server data. Také budeme diskutovat o statické a dynamické způsoby, jak používat PIVOT a UNPIVOT relační operátory, které mohou být použity k transformaci souhrnné odlišné hodnoty jako sloupce(y) ve výsledku-nastavit zadáním všech hodnot sloupců v KONTINGENČNÍ V bodě.

SQL Server pivot Úvod

existuje několik způsobů, jak transponovat datovou sadu z řádků do sloupců a sloupců do řádků. SQL Pivot je jednou z technik, která umožňuje transponování řádků do sloupců a provádí možné agregace podél cesty. SQL PIVOT a SQL UNPIVOT relační operátory transponují dvourozměrná data v tabulce do jiné formy dat. SQL PIVOT transponuje výraz s hodnotou tabulky z jedinečné sady hodnot z jednoho sloupce do více sloupců ve výstupu a provádí agregace. SQL UNPIVOT provádí opačnou operaci PIVOT SQL transformací sloupců výrazu s hodnotou tabulky na hodnoty sloupců.

ve většině případů postačuje obchodní požadavek statická otočná technika. Například měsíční prognóza prodeje, roční rozdělení prodeje, čtvrtletní agregace prodeje atd., kde sloupce v klauzuli zůstávají statické. V některých jiných případech, potřebujeme granulární podrobnosti a tabulka-hodnota výrazu je více dynamický v přírodě a celou dobu novou sadu vyjádření jsou uvedeny v tabulce pak dynamické PIVOT by byl nejlepší volbou.

Poznámka: Ve výše uvedeném zobrazení vidíme, že v procesu PIVOT sloupec hodnoty jsou otočen ze svislé do vodorovné polohy a UNPIVOTING je jako otočení z horizontální na vertikální.

Syntax

SELECT <non-pivoted column>,

AS <column alias>,

AS <column alias>,

AS <column alias>

FROM

(

<SELECT QUERY>)

AS <Alias for temporary data set>

PIVOT

(

<Aggregate function>( Aggregate column)

FOR

IN ( , ,

… )

) AS <Kontingenční tabulka alias>

< ORDER BY klauzule>;

začínáme s SQL Pivot

začneme s otočnou a un-otočná data. Nyní pochopíte, jaké operátory PIVOT a UNPIVOT jsou v SQL Serveru. Jednoduše řečeno, je to jen další způsob, jak popsat proces přeměny odlišných hodnot řádků na jejich vlastní sloupce, je známý jako otáčení. A proces přeměny sloupců na řádky je známý jako un-pivoting.

Příklad 1: Jak provést operaci Pivot SQL

představme si ukázkový datový soubor odvozený z databáze AdventureWorks2014. V tomto případě jste právě dostali jednoduchý datový soubor se sloupcem SalesYear podél jedné kvantitativní hodnoty TotalSales.

nyní je datová sada připravena k otočení. V prvním sloupci máte Sales year, ve druhém sloupci TotalSales. Pokud jste požádali o provedení dat, musíte ve sloupci vzít každý zřetelný rok a tyto sloupce se stanou hlavičkou otočných sloupců. Takže rok 2011 se stává prvním sloupcem, rok 2012 se stává vlastním sloupcem a tak dále. Skutečné hodnoty z dalšího sloupce jsou Součtyprodeje, drží se záhlaví otočných sloupců. Nyní by otočná tabulka vypadala níže.

1
2
3
4
5
6
7
8
9
10

SELECT * FROM
(
VYBERTE ROK(SOH.OrderDate) jako SalesYear,
SOH.Mezisoučet jako Součtyprodeje
z prodeje.SalesOrderHeader SOH
připojte se k prodeji.SalesOrderDetail SOD na SOH.SalesOrderId = SOD.SalesOrderId
) JAKO Prodeje
PIVOT (SUM(TotalSales)
PRO SalesYear V (,,,))
jako PVT

následující obrázek zobrazuje vstupní data, Kontingenční syntaxe, SQL Pivot, a výstup výsledků.

příklad 2: Jak provést operaci SQL Unpivot

podívejme se nyní opačným směrem, un-pivoting, což je stejně jednoduché jako přechod z horizontální na vertikální. V tomto případě byste vzali všechny ty odlišné sloupce, které jsou vybrány, a to by změnilo tyto záhlaví sloupců na jejich vlastní řádky. Otáčení je jako otáčení ze svislé na vodorovnou. A vyklápění je jako otáčení z horizontální na vertikální.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

VYBERTE SalesYear,
TotalSales
(
SELECT *
(
VYBERTE ROK(SOH.OrderDate) jako SalesYear,
SOH.Mezisoučet jako Součtyprodeje
z prodeje.SalesOrderHeader SOH
připojte se k prodeji.SalesOrderDetail SOD na SOH.SalesOrderId = SOD.SalesOrderId
) JAKO Prodej PIVOT(SUM(TotalSales) PRO SalesYear V(,
)) JAKO PVT
) T UNPIVOT(TotalSales PRO SalesYear V(,
)) JAKO upvt;

V následujícím příkladu, výkyvnou dataset se používá k osn-kontingenční hodnoty. Klíčovou je zde to bylo snadné dostat transformována, protože jsme byli schopni vytvořit kontingenční tabulku jako mezistupeň a pak provést transformace, použití unpivot provoz.

Poznámka: SQL pivot výsledky operace při provádění souhrnné výsledek do sloupce, ale vzhledem k tomu, že SQL unpivot není exaktní obrácení provedení sloupce do oddělených hodnot řádků. Operátor unpivot nebude rozdělovat agregované výsledky.

příklad 3: Jak získat čtvrtletní tržby pomocí operace pivot SQL

podívejme se na několik dalších příkladů, abychom lépe porozuměli koncepcím otáčení. V tomto případě uvidíme, jak získat čtvrtletní údaje o prodeji agregované na základě čtvrtletních prodejů.

než skočíme do řešení, vždy doporučujeme pracovat na vytvoření datové sady pro operaci PIVOT.

následující příklad uvádí agregované měsíční tržby rozložené v průběhu prodejního roku.

1
2
3
4
5
6
7
8
9

VYBERTE ROK(SOH.OrderDate) jako SalesYear,
měsíc(SOH.OrderDate) jako SalesMonth,
SUM(SOH.Mezisoučet) jako součty prodejů
z prodeje.SalesOrderHeader SOH
připojte se k prodeji.SalesOrderDetail SOD na SOH.SalesOrderId = SOD.SalesOrderId
skupina podle roku(SOH.OrderDate),
měsíc(SOH.OrderDate)
pořadí podle roku(SOH.OrderDate),
měsíc(SOH.Datumobjednávky);

následující výstup ukazuje základní údaje

Jakmile jste připraveni s bází dat, můžete použít KONTINGENČNÍ operátora. V následujícím příkladu klauzule IN přijímá nečíselný znak, který byl vygenerován na základě hodnoty DATEPART. Hodnota DATEPART je zřetězena s‘ Q ‚ a pak hodnoty jsou přiváděny do klauzule PIVOT operátora.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

VYBERTE SalesYear,
ISNULL(, 0) Q1
ISNULL(, 0) Q2,
ISNULL(, 0) JAKO Q3,
ISNULL(, 0) JAKO Q4,
(ISNULL(, 0) + ISNULL(, 0) + ISNULL(, 0) + ISNULL (, 0)) SalesYTD
z
(
vyberte rok (SOH.OrderDate) jako SalesYear,
CAST (‚Q‘ +CAST (DATEPART (čtvrtletí, SOH.OrderDate) jako VARCHAR (1)) jako VARCHAR (2)) čtvrtiny,
SOH.Mezisoučet jako Součtyprodeje
z prodeje.SalesOrderHeader SOH
připojte se k prodeji.SalesOrderDetail SOD na SOH.SalesOrderId = SOD.SalesOrderId
) JAKO Data PIVOT(SUM(TotalSales) ZA Čtvrtletí, VE(,
)) JAKO pvt
OBJEDNÁVKY SalesYear;

následující výstup je čtvrtletní členění údajů o prodeji

Příklad 4: Jak se dostat měsíční prodeje pomocí SQL pivot operace

Pojďme se podívat na další příklad viz prodejní rozdělení dat na základě každý měsíc. V následujícím příkladu jsou hodnoty klauzule IN generovány jako součást funkce DATEPART. Hodnoty DATEPART jsou přiváděny do klauzule PIVOT operátora.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

VYBERTE SalesYear,
Isnull(, 0) jako Jan,
Isnull(, 0) jako Únor,
Isnull(, 0) jako Mar,
ISNULL(, 0) jako Apr,
isnull(, 0), jak Může,
isnull(, 0) jako Jun,
isnull(, 0) jako Jul,
isnull(, 0) jako Aug,
isnull(, 0) jako Sep,
ISNULL(, 0) jako Oct,
isnull(, 0) jako Nov,
isnull(, 0) jako Dec,
(isnull(, 0) + isnull(, 0) + ISNULL(, 0) + isnull(, 0) + isnull(, 0) + isnull(, 0) + ISNULL(, 0) + ISNULL(, 0) + isnull(, 0) + isnull(, 0) +isnull (, 0) + isnull (, 0) + isnull (, 0) + ISNULL(, 0) + ISNULL(, 0) + ISNULL (, 0)) SalesYTD
z
(
vyberte rok (SOH.OrderDate) jako SalesYear,
DATEPART (měsíc, SOH.OrderDate) měsíců,
SOH.Mezisoučet jako Součtyprodeje
z prodeje.SalesOrderHeader SOH
připojte se k prodeji.SalesOrderDetail SOD na SOH.SalesOrderId = SOD.SalesOrderId
) JAKO Data PIVOT(SUM(TotalSales) PRO Měsíce, V(,
,
)) JAKO pvt;

následující výstup je měsíční rozdělení prodejních dat

Příklad 5: Jak se dostat měsíční prodeje pomocí dynamického SQL pivot operace

Dejte nám adresu, měsíční rozdělení prodejních dat pomocí dynamického otáčení. Zatím jsme diskutovali o statických otočných operacích. Chcete-li převést statickou operaci otáčení na dynamickou, musíme odstranit pevně zakódované hodnoty z klauzule IN. Nejprve získejte zřetelný výraz z datové sady a poté připravte řetězec zřetězením všech výrazů. V následujícím příkladu se @columnname používá ke zřetězení všech výrazů. Zřetězený výraz je přiváděn k otáčení v klauzuli. Zbytek je jednoduchá konverze statického SQL do dynamického SQL a volání @DML pomocí sp_executesql uložené procedury.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

s UVEDENÍM @dml JAKO NVARCHAR(MAX)
PROHLÁSIL @ColumnName JAKO NVARCHAR(MAX)
SELECT @ColumnName= ISNULL(@ColumnName + ‚,‘,“)
+ QUOTENAME(Měsíce)
(SELECT DISTINCT DATEPART(MONTH, SOH.OrderDate) měsíců
od prodeje.SalesOrderHeader SOH
připojte se k prodeji.SalesOrderDetail SOD na SOH.SalesOrderId = SOD.SalesOrderId
skupina podle roku(SOH.OrderDate),
DATEPART(měsíc, SOH.Datumobjednávky)) JAKO Měsíců
–Připravit KONTINGENČNÍ dotaz pomocí dynamické
SET @dml =
N’SELECT SalesYear, ‚+@ColumnName + ‚
(
VYBERTE ROK(SOH.OrderDate) jako SalesYear,
DATEPART (měsíc, SOH.OrderDate) měsíců,
SUM(SOH.Mezisoučet) jako součty prodejů
z prodeje.SalesOrderHeader SOH
připojte se k prodeji.SalesOrderDetail SOD na SOH.SalesOrderId = SOD.SalesOrderId
skupina podle roku(SOH.OrderDate),
DATEPART(měsíc, SOH.Datumobjednávky)), POKUD T
PIVOT(SUM(TotalSales)
PO dobu Měsíců, V (‚ + @ColumnName + ‚)) JAKO PVTTable‘
–Print @DynamicPivotQuery
– Provést Dynamické Pivot Dotaz
EXEC sp_executesql @dml

To je pro teď vše…

Balení

Tak daleko, jsme demonstrovali základní pojmy a několik příkladů SQL PIVOT a SQL UNPIVOT.

ukázka je založena na databázi SQL Server adventureworks2014. Můžete vyzkoušet a vyzkoušet všechny vzorky sami. Pokud máte jakýkoliv dotaz, prosím, neváhejte komentář níže…

  • Autora
  • Poslední Příspěvky
Prashanth Jayaram
jsem Databáze technolog mít 11+ let bohaté, hands-on zkušeností na Databázové technologie. Jsem Microsoft Certified Professional a couval s titulem Master of počítačové aplikace.
Moje specializace spočívá v navrhování & prováděcí Vysokou dostupnost řešení a cross-platform DB Migrace. Technologie, které v současné době pracují, jsou SQL Server, PowerShell, Oracle a MongoDB.
Zobrazit všechny příspěvky od Prashanth Jayaram

Prashanth Jayaram
Nejnovější příspěvky Prashanth Jayaram (zobrazit všechny)
  • rychlý přehled z databáze auditu v SQL – 28. ledna 2021
  • Jak nastavit Azure Synchronizace Dat mezi SQL Azure databází a on-premises serveru SQL Server – 20. ledna 2021
  • Jak provést SQL Azure databáze Import/Export operace pomocí PowerShell – 14. ledna 2021

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *