リレーショナルデータベースは、膨大な量のデータをテーブルの形式で保存します。これらのテーブルには、任意の数の行と列を含めることができます。しかし、行レベルのデータを列データに変更する必要がある場合はどうでしょうか。 SQL Pivotに関するこの記事では、SQLServerで行を列に変換する方法を紹介します。
この記事では、次のトピックについて説明します。
- SQLのPIVOTとは何ですか?
- 構文
- 例
- PIVOT条項の機能
- SQL UNPIVOT
SQLのPIVOTとは何ですか?
PIVOTは、単一の列の一意の値を複数の列に変換することにより、テーブル値を回転させるために使用されます。これは、行を列値にローテーションするために使用され、残りの列値に対して必要に応じて集計を実行します。
一方、UNPIVOTは、反対の操作を実行するために使用されます。したがって、特定のテーブルの列を列の値に変換するために使用されます。
この記事に進んで、SQLピボットの構文を理解しましょう。
構文:
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];
ここでは、ORDER BY句を使用して、値を昇順または降順で並べ替えることもできます。 SQLでのPIVOTとその基本的な構文がわかったところで、次に進んでその使用方法を見てみましょう。
例
理解を深めるために、すべての例を説明するために次の表を検討します。
サプライヤーテーブル:
SupplierID | DaysofManufacture | コスト | CustomerID | PurchaseID |
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 |
各顧客が費やした平均コストを取得するための簡単なクエリを作成しましょう。
SELECT CustomerID, AVG(Cost) AS AverageCostofCustomer FROM Suppliers GROUP BY CustomerID;
出力:
CustomerID | AverageCostofCustomer |
11 | 1787.75 |
22 | 4654 |
33 | 5238.33 |
ここで、上記のテーブルをピボットしたいとしましょう。ここでは、CustomerID列の値が列ヘッダーになります。
-- 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;
出力:
Cost_According_To_Customers | 11 | 22 | 33 |
AverageCostofCustomer | 1787.75 | 4654 | 5238.33 |
注: PIVOTで集計関数を使用する場合、集計の計算時にnull値は考慮されません。
これは基本的な例ですが、PIVOT句がどのように機能したかを理解しましょう。
PIVOT句の機能
上記を参照できるように、ピボットテーブルを作成するには、次の手順に従う必要があります。
- ピボットする列を選択する
- 次に、ソーステーブルを選択します。
- PIVOT演算子を適用してから、集計関数を使用します。
- ピボット値に言及します。
ピボットする列を選択
最初に、結果に含めるフィールドを指定する必要があります。この例では、ピボットテーブルのAverageCostofCustomer列を検討しました。次に、列ヘッダー11、22、および33を使用して他の3つの列を作成しました。例-
SELECT 'AverageCostofCustomer' AS Cost_According_To_Customers, [11], [22], [33]
ソーステーブルを選択
次に、ピボットテーブルのソースデータを返すSELECTステートメントを指定する必要があります。この例では、SuppliersテーブルからCustomerIDとCostを返しています。
(SELECT CustomerID, Cost FROM Suppliers) AS SourceTable
PIVOT演算子を適用してから、集計関数を使用します
次に、ピボットテーブルの作成時に使用する集計関数を指定する必要があります。この例では、AVG関数を使用して平均コストを計算しました。
PIVOT ( AVG(Cost)
メンションピボット値
最後に、結果のピボットテーブルに含める必要のある値について言及する必要があります。これらの値は、ピボットテーブルの列見出しとして使用されます。
FOR CustomerID IN ([11], [22], [33]) ) AS PivotTable;
これがPIVOTオペレーターの仕組みです。 SQL PIVOTに関するこの記事に進んで、SQLUNPIVOTとの違いを理解しましょう。
SQL UNPIVOT
SQL UNPIVOT演算子は、PIVOTの操作とは逆の操作を実行するために使用されます。これは、列データを行レベルのデータにローテーションするために使用されます。 UNPIVOTの構文は、PIVOTの構文と似ています。唯一の違いは、SQLキーワード「UNPIVOT」を使用する必要があることです。 。
例:
列SupplierID、AAA、BBB、およびCCCを使用してテーブルを作成しましょう。また、いくつかの値を挿入します。
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
出力:
SupplierID | AAA | BBB | CCC |
1 | 3 | 5 | 6 |
2 | 9 | 2 | 8 |
3 | 8 | 1 | 7 |
ここで、テーブルのピボットを解除したいとします。これを行うには、次のコードを参照できます。
SELECT SupplierID, Customers, Products FROM (SELECT SupplierD, AAA, BBB, CCC FROM sampletable) p UNPIVOT (Products FOR Customers IN (AAA, BBB, CCC) )AS example; GO
SupplierID | お客様 | 製品 |
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 |
これが、SQLPIVOTとUNPIVOTの使用方法です。これで、この記事は終わりです。 SQLの使い方をご理解いただければ幸いです。 MySQLについて詳しく知り、このオープンソースのリレーショナルデータベースについて知りたい場合は、MySQLDBA認定トレーニングをご覧ください。 インストラクター主導のライブトレーニングと実際のプロジェクトの経験が付属しています。このトレーニングは、MySQLを深く理解し、主題をマスターするのに役立ちます。
質問がありますか? SQLPivotに関するこの記事のコメントセクションでそれについて言及してください。折り返しご連絡いたします。