SQLShack

w tym artykule omówimy operatory SQL Pivot i SQL Unpivot oraz sposoby ich przydatności do transpozycji danych serwera SQL. Omówimy również zarówno statyczne, jak i dynamiczne sposoby używania operatorów relacyjnych PIVOT i UNPIVOT, które można wykorzystać do przekształcenia zagregowanych odrębnych wartości jako kolumn w zestawie wyników, określając wszystkie wartości kolumn w klauzuli PIVOT in.

wprowadzenie do SQL Server pivot

istnieje kilka sposobów transpozycji zbioru danych z wierszy do kolumn i kolumn do wierszy. SQL Pivot jest jedną z technik, która umożliwia transpozycję wierszy do kolumn i wykonuje możliwe agregacje po drodze. Operatory relacyjne SQL PIVOT i SQL UNPIVOT transponują dwuwymiarowe dane o wartości tabelarycznej do innej formy danych. SQL PIVOT transponuje wyrażenie wartości tabeli z unikalnego zestawu wartości z jednej kolumny do wielu kolumn na wyjściu i wykonuje agregacje. SQL UNPIVOT wykonuje odwrotną operację SQL PIVOT, przekształcając kolumny wyrażenia wartości tabeli na wartości kolumn.

w większości przypadków statyczna technika obrotu wystarcza do spełnienia wymagań biznesowych. Na przykład Miesięczna prognoza sprzedaży, roczny podział sprzedaży, kwartalna agregacja sprzedaży itp., w których kolumny klauzuli IN pozostają statyczne. W niektórych innych przypadkach potrzebujemy szczegółowych szczegółów, a wyrażenie wartości tabeli ma charakter bardziej dynamiczny i cały czas nowy zestaw wyrażenia jest zawarty w tabeli, wtedy dynamiczny PIVOT byłby najlepszym wyborem.

Uwaga: w powyższym obrazie widzimy, że w procesie Pivota wartości kolumn są obracane z pionu na poziome, a UNPIVOTOWANIE jest jak obracanie z poziomu na pion.

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 <alias tabeli przestawnej>

< kolejność według klauzuli>;

wprowadzenie do SQL Pivot

zaczniemy od obracania i od-obracania danych. Już teraz rozumiesz, jakie operatory PIVOT i UNPIVOT są w SQL Server. W prostych słowach, jest to po prostu inny sposób na opisanie procesu przekształcania różnych wartości wierszy do własnych kolumn jest znany jako Pivoting. Proces przekształcania kolumn w Wiersze jest znany jako un-pivoting.

przykład 1: Jak wykonać operację SQL Pivot

Wyobraźmy sobie przykładowy zestaw danych pochodzący z bazy danych AdventureWorks2014. W tym przypadku masz prosty zestaw danych z kolumną SalesYear wzdłuż jednej wartości ilościowej Sumalsales.

teraz zestaw danych jest gotowy do obracania. Masz SalesYear w pierwszej kolumnie, Sumalsales w drugiej kolumnie. Jeśli poprosiłeś o transpozycję danych, musisz wziąć każdy odrębny rok w kolumnie, a te kolumny stają się nagłówkiem kolumn przestawnych. Tak więc 2011 staje się pierwszą kolumną, 2012 staje się własną kolumną i tak dalej. Rzeczywiste wartości z następnej kolumny sumują się, trzymają się nagłówków kolumn obrotowych. Teraz, tabela przestawna będzie wyglądać poniżej.

1
2
3
4
5
6
7
8
9
10

select * from
(
wybierz rok(SOH.OrderDate) jako SalesYear,
SOH.SubTotal as TotalSales
ze sprzedaży.SalesOrderHeader SOH
dołącz do sprzedaży.SalesOrderDetail SOD ON SOH.SalesOrderId = SOD.SalesOrderId
) AS Sales
PIVOT (SUM(TotalSales)
FOR SalesYear IN (,,,))
as PVT

poniższy obraz przedstawia dane wejściowe, składnia pivot, Pivot sql i wyniki wyjściowe.

przykład 2: Jak wykonać operację SQL Unpivot

spójrzmy teraz w innym kierunku, un-pivoting, który jest tak prosty, jak przejście od poziomego do pionowego. W takim przypadku należy wziąć wszystkie te odrębne kolumny, które są zaznaczone, i zamienić te nagłówki kolumn w ich własne wiersze. Obracanie jest jak obracanie z pionu do poziomu. A un-pivoting jest jak obracanie z poziomu do pionu.

WYBIERZ Rok sprzedaży,
Podsumowanie sprzedaży
Z
(
WYBIERZ *
Z
(
WYBIERZ ROK (COX.OrderDate) jako SalesYear,
SOH.SubTotal AS TotalSales
ze sprzedaży.SalesOrderHeader SOH
dołącz do sprzedaży.SalesOrderDetail SOD ON SOH.SalesOrderId = SOD.SalesOrderId
) AS Sales PIVOT(SUM(TotalSales) FOR SalesYear IN(,
,
,
)) AS PVT
) T UNPIVOT(TotalSales FOR SalesYear IN(,
,
,
)) AS upvt;

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

w poniższym przykładzie do odpicowania wartości używany jest obrotowy zestaw danych. Najważniejsze jest to, że łatwo było to zrobić, ponieważ byliśmy w stanie utworzyć tabelę przestawną jako etap pośredni, a następnie wykonać transformację za pomocą operacji unpivot.

Uwaga: operacja SQL pivot powoduje przeniesienie zagregowanego wyniku do kolumny, ale podczas gdy SQL unpivot nie jest dokładnym odwrócenie transpozycji kolumn do segregowanych wartości wierszy. Operator unpivot nie podzieli zagregowanych wyników.

przykład 3: Jak uzyskać sprzedaż kwartalną za pomocą operacji pivot SQL

zobaczmy jeszcze kilka przykładów, aby lepiej zrozumieć koncepcje pivotowania. W takim przypadku zobaczymy, jak uzyskać kwartalne dane Sprzedaży zagregowane na podstawie sprzedaży kwartalnej.

zanim przejdziemy do rozwiązania, zawsze zaleca się pracę nad stworzeniem zestawu danych dla operacji PIVOT.

poniższy przykład przedstawia zagregowany miesięczny spread sprzedaży w ciągu roku sprzedaży.

1
2
3
4
5
6
7
8
9

WYBIERZ ROKU (T. zw.Data zamówienia) JAKO roku sprzedaży,
MIESIĄC (T. zw.Data zamówienia) JAKO Miesiąc sprzedaży,
KWOTA (Tj. suma częściowa) JAKO sumy sprzedaży
OD sprzedaży.SalesOrderHeader Sox
dołącz do sprzedaży.Zamówienie sprzedaży wyszczególnia SOD na SOH.Identyfikator zamówienia = SOD.Identyfikator zamówienia
Grupa według roku (COX.OrderDate),
miesiąc(SOH.OrderDate)
kolejność według roku (SOH.OrderDate),
miesiąc(SOH.Poniżej przedstawiono dane bazowe

gdy będziesz gotowy z danymi bazowymi, możesz zastosować operator pivot. W poniższym przykładzie, klauzula IN akceptuje Nie numeryczny znak, który został wygenerowany na podstawie wartości DATEPART. Wartość DATEPART jest łączona z 'Q’, A następnie wartości są przekazywane do klauzuli IN operatora PIVOT.

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

WYBIERZ rok sprzedaży,
ZERO (, 0) JAKO Q1,
ZERO(, 0) JAKO Q2,
ZERO(, 0) JAKO Q3,
WARTOŚĆ WYNOSI ZERO(, 0) JAK Q4
(WARTOŚĆ RÓWNA ZERO(, 0) + WARTOŚĆ WYNOSI ZERO(, 0) + ISNULL(, 0) + ISNULL(, 0)) SalesYTD
FROM
(
wybierz rok(SOH.OrderDate) jako SalesYear,
CAST(’Q’+CAST(DATEPART(QUARTER, SOH.OrderDate) AS VARCHAR (1)) AS VARCHAR (2)) Quarters,
SOH.SubTotal AS TotalSales
ze sprzedaży.SalesOrderHeader SOH
dołącz do sprzedaży.SalesOrderDetail SOD ON SOH.SalesOrderId = SOD.SalesOrderId
) AS data PIVOT(SUM (TotalSales) FOR Quarters IN (,
,
,
)) AS pvt
ORDER BY SalesYear;

poniższy wynik to kwartalny podział danych sprzedaży

przykład 4: Jak uzyskać miesięczną sprzedaż za pomocą operacji pivot SQL

przyjrzyjmy się innemu przykładowi, aby zobaczyć dane podziału sprzedaży na podstawie każdego miesiąca. W poniższym przykładzie wartości klauzuli IN są generowane jako część funkcji DATEPART. Wartości DATEPART są przekazywane do klauzuli IN operatora PIVOT.

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

WYBIERZ rok sprzedaży,
Zero(, 0) jak styczeń,
Zero(, 0) jako stycznia,
Zero(, 0) jak marzec,
ZERO(, 0) jak kwiecień,
zero(, 0) jak maj,
zero(, 0) jak czerwiec,
zero(, 0) jak lipiec,
zero(, 0) jak sierpień,
zero(, 0) jak wrzesień,
ZERO(, 0) jak październik,
zero(, 0) jak października,
zero(, 0) jak października,
zero(, 0) jak grudzień,
(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) + 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)) data sprzedaży
z
(
wybierz rok (tzw. Data zamówienia) jako rok sprzedaży,
część daty (miesiąc, tzw. Data zamówienia) miesięcy,
COX.Suma pośrednia jako suma sprzedaży
ze sprzedaży.SalesOrderHeader Sox
dołącz do sprzedaży.Zamówienie sprzedaży wyszczególnia SOD na SOH.Identyfikator zamówienia = SOD.SalesOrderID
) jako dane podsumowujące (suma (całkowita sprzedaż) za miesiące w(,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
)) jako Pvt;

poniższy wynik to miesięczny podział danych sprzedaży

przykład 5: Jak uzyskać miesięczną sprzedaż za pomocą dynamicznej operacji pivot SQL

pozwól nam adres miesięczny podział danych sprzedaży za pomocą dynamicznego obrotu. Do tej pory omawialiśmy statyczne operacje obrotu. Aby skonwertować statyczną operację obrotu na dynamiczną, musimy usunąć zakodowane na stałe wartości z klauzuli IN. Najpierw pobierz odrębne wyrażenie ze zbioru danych, a następnie przygotuj ciąg poprzez połączenie wszystkich wyrażeń. W poniższym przykładzie nazwa kolumny @jest używana do połączenia całego wyrażenia. Skonkatenowane wyrażenie jest przekazywane do klauzuli pivot IN. Reszta to prosta konwersja statycznego SQL na dynamiczny SQL i wywołanie @DML przy użyciu procedury składowanej sp_executesql.

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

WSKAZÓWKA @dml JAKO NVARCHAR(MAX)
OGŁOSZONE @ColumnName AS nvarchar (MAX)
SELECT @ColumnName= ISNULL(@ColumnName+’,’,”)
+ QUOTENAME(Months)
FROM (SELECT DISTINCT DATEPART(MONTH, SOH.OrderDate) miesięcy
ze sprzedaży.SalesOrderHeader SOH
dołącz do sprzedaży.SalesOrderDetail SOD ON SOH.SalesOrderId = SOD.SalesOrderId
Grupa według roku (SOH.OrderDate),
DATEPART(MONTH, SOH.OrderDate)) AS Months
–Prepare the PIVOT query using the dynamic
SET @dml =
n 'select SalesYear,’ +@ColumnName + ’ FROM
(
SELECT YEAR(SOH.OrderDate) jako SalesYear,
DATEPART(MONTH, SOH.OrderDate) miesięcy,
SUM (SOH.SubTotal) AS TotalSales
FROM sales.SalesOrderHeader SOH
dołącz do sprzedaży.SalesOrderDetail SOD ON SOH.SalesOrderId = SOD.SalesOrderId
Grupa według roku (SOH.OrderDate),
DATEPART(MONTH, SOH.W tym celu należy wykonać dynamiczne zapytanie Pivot
EXEC sp_executesql @dml

To wszystko na razie…

Podsumowując

do tej pory zademonstrowaliśmy podstawowe pojęcia i kilka przykładów SQL Pivot i SQL unpivot.

Próbka jest oparta na bazie danych SQL Server adventureworks2014. Możesz spróbować i przetestować wszystkie próbki samodzielnie. Jeśli masz jakiekolwiek pytania, prosimy o komentarz poniżej…

  • Autor
  • Ostatnie posty
Prashanth Jayaram
jestem technologiem baz danych z ponad 11-letnim bogatym, praktycznym doświadczeniem w technologiach bazodanowych. Posiadam certyfikat Microsoft Certified Professional i posiadam Dyplom Master of Computer Application.
moją specjalnością jest projektowanie & wdrażanie rozwiązań wysokiej dostępności i wieloplatformowa migracja DB. Obecnie stosowane technologie to SQL Server, PowerShell, Oracle i MongoDB.
Zobacz wszystkie posty Prashanth Jayaram

Prashanth Jayaram
najnowsze posty Prashanth Jayaram (Zobacz wszystkie)
  • szybki przegląd audytu bazy danych w SQL – Styczeń 28, 2021
  • Jak to zrobić? skonfiguruj Azure Data Sync między bazami danych Azure SQL a lokalnym serwerem SQL-20 stycznia 2021 r
  • jak wykonywać operacje importu/eksportu bazy danych Azure SQL przy użyciu PowerShell – 14 stycznia 2021 r

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *