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

MySQLで動的ピボットテーブルを作成する方法

    ピボットテーブルを使用すると、情報をより小さく管理しやすいデータセットに整理することで、大量のデータを簡単に分析できます。ただし、MySQLでピボットを実現するための組み込み関数はありません。 MySQLで行を列に変換するSQLクエリを記述してから、MySQLでピボットレポートを作成する必要があります。それでは、MySQLで動的ピボットテーブルを作成する方法を見てみましょう。

    MySQLで動的ピボットテーブルを作成する方法

    MySQLでピボットテーブルを作成する場合は、通常、IF/CASEステートメントを使用します。ただし、このアプローチは、ピボットテーブルに作成する必要のあるすべての列をすでに知っている場合にのみ機能します。

    作成する列がわからない場合、または列が時間の経過とともに変化すると予想される場合、MySQLで動的ピボットテーブルをどのように作成しますか?このような場合、 GROUP_CONCATを使用します 機能。

    次の表があるとします

    CREATE TABLE Meeting
    (
        ID INT,
        Meeting_id INT,
        field_key VARCHAR(100),
        field_value VARCHAR(100)
    );
    
    INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
    VALUES (1, 1,'first_name' , 'Alec');
    INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
    VALUES (2, 1,'last_name' , 'Jones');
    INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
    VALUES (3, 1,'occupation' , 'engineer');
    INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
    VALUES (4,2,'first_name' , 'John');
    INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
    VALUES (5,2,'last_name' , 'Doe');
    INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
    VALUES (6,2,'occupation' , 'engineer');
    
    +------+------------+------------+-------------+
    | ID   | Meeting_id | field_key  | field_value |
    +------+------------+------------+-------------+
    |    1 |          1 | first_name | Alec        |
    |    2 |          1 | last_name  | Jones       |
    |    3 |          1 | occupation | engineer    |
    |    4 |          2 | first_name | John        |
    |    5 |          2 | last_name  | Doe         |
    |    6 |          2 | occupation | engineer    |
    +------+------------+------------+-------------+
    

    field_key の一意の値ごとに新しい列が作成されるように、動的ピボットテーブルを作成するとします。 列、つまり(first_name、last_name、occupation)

    +------------+-------------+-------------+-------------+
    | Meeting_id | first_name  |  last_name  |  occupation |
    +------------+-------------+-------------+-------------+
    |          1 |       Alec  | Jones       | engineer    |
    |          2 |       John  | Doe         | engineer    |
    +------------+-------------+-------------+-------------+

    MySQLで動的ピボットテーブルを作成する

    ピボットテーブルに作成する列がすでにわかっている場合は、CASEステートメントを使用してピボットテーブルを作成できます。ただし、MySQLで動的ピボットテーブルを作成するには、 GROUP_CONCATを使用します。 以下に示すように、行を列に動的に転置する関数。

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when field_key = ''',
          field_key,
          ''' then field_value end) ',
          field_key
        )
      ) INTO @sql 
    FROM
      Meeting;
    SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                      FROM Meeting 
                       GROUP BY Meeting_id');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
    

    GROUP_CONCATを使用すると、複数の行の値を1つの文字列に連結できます。上記のクエリでは、GROUP_CONCATを使用して、 field_key の一意の値に基づいて、CASEステートメントを動的に作成します。 列を作成し、その文字列を@sql変数に格納します。次に、これを使用して選択クエリを作成します。

    +------------+------------+-----------+------------+
    | Meeting_id | first_name | last_name | occupation |
    +------------+------------+-----------+------------+
    |          1 | Alec       | Jones     | engineer   |
    |          2 | John       | Doe       | engineer   |
    +------------+------------+-----------+------------+
    

    このようにして、MySQLでピボットテーブルクエリを自動化できます。

    WHERE句またはJOINSを追加することで、要件に応じて上記のクエリをカスタマイズできます。

    選択した行の値のみを列としてピボットする場合は、太字に示すように、最初のselectGROUP_CONCATステートメントにWHERE句を追加できます。 以下

    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when field_key = ''',
          field_key,
          ''' then field_value end) ',
          field_key
        )
      ) INTO @sql
    FROM
      Meeting
    WHERE <condition>;
    
    

    最終的なピボットテーブルの行をフィルタリングする場合は、太字に示すように、SETステートメントにWHERE句を追加できます。 以下。

    SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                      FROM Meeting WHERE <condition>
                       GROUP BY Meeting_id');
    

    同様に、MySQLで動的ピボットテーブルを作成するときに、SQLクエリにJOINSを適用することもできます。

    MySQLで動的ピボットテーブルを作成したら、レポートツールを使用してそれをテーブルにプロットできます。これは、Ubiqを使用して作成されたピボットテーブルの例です。

    SQLを記述せずにUbiqで動的ピボットテーブルを作成できることをご存知ですか?

    ちなみに、MySQLデータベースからピボットテーブル、チャート、ダッシュボードを作成したい場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。

    1. T-SQLを使用してSQLServerでデータベースの互換性レベルを確認する方法

    2. SQLのデータ型のサイズを変更します

    3. AmazonAurorasMulti-AZデプロイメントを理解する

    4. SQLServer整数をバイナリ文字列に変換する