この記事では、SQL PivotおよびSQL Unpivot演算子と、それらがSQL Serverデータを転置する また、PIVOT IN句ですべての列値を指定することにより、集計された個別の値を結果セット内の列として変換するために使用できるPIVOTおよびUNPIVOT関係演算子を使用する静的および動的の両方の方法についても説明します。
SQL Server pivot Introduction
データセットを行から列に、列から行に転置するには、いくつかの方法があります。 SQL Pivotは、行から列への転置を可能にし、途中で可能な集計を実行する技術の1つです。 SQL PIVOTおよびSQL UNPIVOT関係演算子は、テーブル値の二次元データを別の形式のデータに転置します。 SQL PIVOTは、1つの列の一意の値セットから出力内の複数の列にテーブル値式を転置し、集計を実行します。 SQL UNPIVOTは、テーブル値式の列を列値に変換することによって、SQL PIVOTの逆の操作を実行します。
ほとんどの場合、静的ピボットテクニックはビジネス要件で十分です。 たとえば、月次売上予測、年間売上分割、四半期売上集計などで、IN句の列は静的なままです。 他のいくつかの例では、詳細な詳細が必要であり、テーブル値式は本質的に動的であり、式の新しいセットがテーブルに含まれるすべての時間は、動的ピボッ
注:上記の描写では、ピボットの過程で、列の値が垂直から水平に回転し、ピボット解除は水平から垂直に回転
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 <>
<ORDER BY clause>;
SQLピボットの概要h2>
まず、データのピボットとピボット解除から始めます。 これで、SQL ServerのPIVOT演算子とUNPIVOT演算子が理解できました。 簡単に言えば、それはピボットとして知られている独自の列に異なる行の値を変換するプロセスを記述するためのちょうど別の方法です。 そして、列を行に変換するプロセスは、非ピボットとして知られています。
例1: SQLピボット操作を実行する方法
Adventureworks2014データベースから派生したサンプルデータセットを図に示します。 この場合、1つの定量的な値TotalSalesに沿ってSalesYear列を持つ単純なデータセットが得られました。 p>
これで、データセットはピボットの準備が整いました。 最初の列にSalesYearがあり、2番目の列にTotalSalesがあります。 データを転置するように要求された場合は、列内のすべての別個の年を取る必要があり、これらの列はピボット列のヘッダーになります。 したがって、2011は最初の列になり、2012は独自の列になります。 次の列Totalsalesからの実際の値は、ピボット列ヘッダーに固執します。 さて、ピボットテーブルは以下のようになります。/div>
1
2
3
4
5
6
7
8
9
10
|
OrderDate)SalesYearとして、
SOH。売上からtotalsales
として小計。SalesOrderHeader SOH
売上に参加します。SohのSalesOrderDetail SOD。SalesOrderId=SOD.SalesOrderId
)As Sales
PIVOT(SUM(TotalSales)
FOR SalesYear IN(,,,))
as PVT
|
次の画像は、入力データ、ピボット構文、SQLピボット、および出力結果を示しています。p>
例2: SQL Unpivot操作を実行する方法
ここで、水平から垂直に行くのと同じくらい簡単な、他の方向、ピボット解除を見てみましょう。 この場合、選択されたすべての個別の列を取得し、それらの列ヘッダーを独自の行に変換します。 ピボットは、垂直から水平に回転するようなものです。 そして、非ピボットは、水平から垂直に回転するようなものです。/div>
1
2
3
4
10
11
12
13
14
15
16
17
18
19
11
12
13
14
15
16
17
18
19
19
19
19
19
19
19
19
19
|
salesyearを選択し、
totalsales
から
(
select*
から
(
select year(soh.OrderDate)SalesYearとして、
SOH。売上からtotalsales
として小計。SalesOrderHeader SOH
売上に参加します。SohのSalesOrderDetail SOD。SalesOrderId=SOD.
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
、
|
次の例では、ピボットされたデータセットを使用して値をピボット解除します。 ここで重要なのは、中間ステップとしてピボットテーブルを作成し、unpivot操作を使用して変換を行うことができたため、変換を行うのが簡単だったことです。
注:SQLピボット操作は集計された結果を列に転置しますが、SQL unpivotは列を分離された値に転置する正確な逆転ではありません行の。 Unpivot演算子は集計結果を分割しません。
例3: SQLピボット操作を使用して四半期売上高を取得する方法
ピボットの概念をよりよく理解するために、いくつかの例を見てみましょう。 このケースでは、四半期売上に基づいて四半期売上データを集計する方法について説明します。
ソリューションにジャンプする前に、ピボット操作のデータセットの作成に取り組むことを常にお勧めします。
次の例では、売上年間の集計された月次売上スプレッドを示しています。/div>
1
2
3
4
5
6
7
8
9
|
////////////////////////////////////////Orderdate)をSalesMonthとして、
SUM(SOH.SubTotal)as TotalSales
売上から。SalesOrderHeader SOH
売上に参加します。SohのSalesOrderDetail SOD。SalesOrderId=SOD.SalesOrderId
年別グループ(SOH.
月(SOH.OrderDate)
年による順序(SOH.
月(SOH.次の出力は、ベースデータを示しています
あなたが準備ができたら、 基本データでは、ピボット演算子を適用できます。 次の例では、IN句は、DATEPART値に基づいて生成された数値以外の文字を受け入れます。 DATEPART値は’Q’と連結され、値はPIVOT演算子のIN句に供給されます。/div> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|