sql >> データベース >  >> RDS >> Database

SQLピボット–行を列に変換する方法を知っている

    リレーショナルデータベースは、膨大な量のデータをテーブルの形式で保存します。これらのテーブルには、任意の数の行と列を含めることができます。しかし、行レベルのデータを列データに変更する必要がある場合はどうでしょうか。 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に関するこの記事のコメントセクションでそれについて言及してください。折り返しご連絡いたします。


    1. MySQL Galeraクラスターレプリケーションを使用した地理分散クラスターの作成:パート1

    2. 一時テーブルを作成する前に、一時テーブルが存在するかどうかを確認し、存在する場合は削除してください

    3. コミットされたスナップショットアイソレーションを読む

    4. SQLiteにデータを挿入するときに制約に違反する行をスキップする方法