SQLServerのピボットおよびグループ化集合演算子
- 12-09-2022
- Toanngo92
- 0 Comments
行と列のレイアウトの条件を使用して、データが保存されている方向とは異なる方向でデータを表示したい状況を視覚化します。データを行ベースから列ベースに変換するプロセスは、ピボットと呼ばれます。 SQL ServerのPIVOTおよびUNPIVOT演算子は、データの向きを列指向から行指向に、またはその逆に変更するのに役立ちます。これは、列に含まれる値を個別の値のリストにマージし、そのリストを列ヘッダーとして投影することによって行われます。
Mục lục
PIVOT。演算子
ドキュメント: https ://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view = sql-server-ver16
構文:
SELECT <non-pivoted column>, [first pivoted column] AS <column name>, [second pivoted column] AS <column name>, ... [last pivoted column] AS <column name> FROM (<SELECT query that produces the data>) AS <alias for the source query> PIVOT ( <aggregation function>(<column being aggregated>) FOR [<column that contains the values that will become column headers>] IN ( [first pivoted column], [second pivoted column], ... [last pivoted column]) ) AS <alias for the pivot table> <optional ORDER BY clause>;
より簡単に言えば、PIVOTを使用するには、構文に3つのコンポーネントが必要です。
- FROM句では、入力列を常に指定する必要があります。PIVOT演算子は、これらの列を使用して、集計用のデータをグループ化するために使用する列を識別します。
- フィードデータに表示されるコンマ区切り文字は、ピボットデータの列見出しとして使用されます。
- SUMなどの集計関数を使用して、レコードの計算とグループ化を実行します。
例えば:
以下の状況を考慮して、1、2、3、4日の場合の平均修理日数を取得する場合、通常GROUP BYを使用すると、構文は次のようになります。
USE AdventureWorks2019 ; GO SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost FROM Production.Product GROUP BY DaysToManufacture;
これにより、DaysToManufacturingレコードの3が失われます。これは、3の場合、データがないためにCOST価格を平均化できないためです。この問題は、PIVOTを介して次のように処理できます。
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4] FROM ( SELECT DaysToManufacture, StandardCost FROM Production.Product ) AS SourceTable PIVOT ( AVG(StandardCost) FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) ) AS PivotTable;
例2:
次のように、Sales.SalesTerritoryテーブルの上位5つのSalesYTD合計を取得します。
SELECT TOP 5 SUM(SalesYTD) AS TotalSalesYTD, Name FROM Sales.SalesTerritory GROUP BY Name
また、データが小さいため、各領域の値のみが表示されるため、データベースをクエリするときにデータベースが1行のみを返すようにデータを水平方向に分散して、データベースの読み取りと分析の機能を向上させることができます。人:
SELECT TOP 5 'TotalSalesYTD' AS GrandTotal, [NorthWest],[NorthEast],[Central],[Southwest],[Southeast] FROM (SELECT TOP 5 Name,SalesYTD FROM Sales.SalesTerritory) AS SourceTable PIVOT (SUM(SalesYTD) FOR Name IN ([NorthWest],[NorthEast],[Central],[Southwest],[Southeast])) AS PivotTable;
PIVOTを使用してクエリを作成する際の主な課題は、PIVOT演算子にスプレッド要素の固定リストを提供する必要があることです。多数の拡散要素に対してこれを行うことは、実行可能または非現実的ではありません。これを克服するために、開発者は動的SQLを使用できます。動的SQLは、SQL Serverに渡され、コマンドとして解釈され、SQLServerによって実行される文字列リテラルを構築するためのソリューションを提供します。
UNPIVOT。演算子
UNPIVOT演算子は、 PIVOTの反対であると理解されています。つまり、軸を列から行に回転させることを意味します。 Unpivotは元の値を保存せず、ピボット時に集計中に詳細データが失われました。 UNPIVOTには、元の詳細データを返すための値を割り当てる機能はありません。行を列に変換する代わりに、ピボット解除の結果は列を行に変換します。 SQL Serverは、データをピボットテーブルから行ベースの方向に変換するためのUNPIVOT演算子を提供します。
データのピボットを解除するときに、ソースとして定義された1つ以上の列が行に変換されます。これらの行のデータは、ピボット解除する必要のある列の数に基づいて、1行から複数行に分散または分割されます。
例えば:
CREATE TABLE pvt (VendorID INT, Emp1 INT, Emp2 INT, Emp3 INT, Emp4 INT, Emp5 INT); GO INSERT INTO pvt VALUES (1,4,3,5,4,4); INSERT INTO pvt VALUES (2,4,1,5,5,5); INSERT INTO pvt VALUES (3,4,3,5,4,4); INSERT INTO pvt VALUES (4,4,2,5,5,4); INSERT INTO pvt VALUES (5,5,1,5,5,5); GO -- Unpivot the table. SELECT VendorID, Employee, Orders FROM (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5 FROM pvt) p UNPIVOT (Orders FOR Employee IN (Emp1, Emp2, Emp3, Emp4, Emp5) )AS unpvt; GO