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

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

    ピボットテーブルはデータ分析に役立ち、行の値を列として表示して、洞察を簡単に得ることができます。ただし、MySQLでピボットテーブルを作成する関数はありません。したがって、MySQLでピボットテーブルを作成するには、SQLクエリを作成する必要があります。幸い、MySQLでピボットテーブルを作成する方法はたくさんあります。それぞれを簡単に見てみましょう。

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

    MySQLでピボットテーブルを作成する手順は次のとおりです。次の表があるとします

    CREATE TABLE exams (
    id int(11) NOT NULL auto_increment,
    name varchar(15),
    exam int,
    score int,
    PRIMARY KEY (id)
    );
    
    insert into exams (name,exam,score) values ('Bob',1,70);
    insert into exams (name,exam,score) values ('Bob',2,77);
    insert into exams (name,exam,score) values ('Bob',3,71);
    insert into exams (name,exam,score) values ('Bob',4,70);
    
    insert into exams (name,exam,score) values ('Sue',1,89);
    insert into exams (name,exam,score) values ('Sue',2,87);
    insert into exams (name,exam,score) values ('Sue',3,88);
    insert into exams (name,exam,score) values ('Sue',4,89);
    
    mysql> select * from exams;
    +------+------+------+-------+
    | id   | name | exam | score |
    +------+------+------+-------+
    |   1  |  Bob |   1  |   70  |
    |   2  |  Bob |   2  |   77  |
    |   3  |  Bob |   3  |   71  |
    |   4  |  Bob |   4  |   70  |
    |   5  |  Sue |   1  |   89  |
    |   6  |  Sue |   2  |   87  |
    |   7  |  Sue |   3  |   88  |
    |   8  |  Sue |   4  |   89  |
    +------+------+------+-------+
    
    
    

    試験でテーブルをピボットしたいとします。 以下に示すように、各学生に1行、各試験に1列を作成するように列を作成します。

    +--------+-----------+-----------+-----------+------------+
    |   name |    exam1  |    exam2  |    exam3  |    exam4   |
    +--------+-----------+-----------+-----------+------------+
    |   Bob  |     70    |     77    |     71    |     70     |
    |   Sue  |     89    |     87    |     88    |     89     |
    +--------+-----------+-----------+-----------+------------+
    

    IFまたはCASEステートメントを使用してMySQLでピボットテーブルを作成できます。

    ボーナスリード:MySQLで中央値を計算する方法

    IFステートメントを使用してMySQLでピボットテーブルを作成する

    これが、IFステートメントを使用して行を列に転置するSQLクエリです。

    SELECT name,
    sum(IF(exam=1, score, NULL)) AS exam1,
    sum(IF(exam=2, score, NULL)) AS exam2,
    sum(IF(exam=3, score, NULL)) AS exam3,
    sum(IF(exam=4, score, NULL)) AS exam4
    FROM exams
    GROUP BY name;
    +--------+-----------+-----------+-----------+------------+
    |   name |    exam1  |    exam2  |    exam3  |    exam4   |
    +--------+-----------+-----------+-----------+------------+
    |   Bob  |     70    |     77    |     71    |     70     |
    |   Sue  |     89    |     87    |     88    |     89     |
    +--------+-----------+-----------+-----------+------------+
    

    上記のクエリでは、グループ化する必要があります 名前 学生ごとに1行が必要なので、列。また、作成する必要のある列ごとに1つの条件、つまり、試験ごとに1つの条件を提供する必要があります

    CASEステートメントを使用してMySQLでピボットテーブルを作成する

    CASEステートメントを使用して行を列に変換するSQLクエリは次のとおりです。

    SELECT name,
    sum(CASE WHEN exam=1 THEN score ELSE NULL END) AS exam1,
    sum(CASE WHEN exam=2 THEN score ELSE NULL END) AS exam2,
    sum(CASE WHEN exam=3 THEN score ELSE NULL END) AS exam3,
    sum(CASE WHEN exam=4 THEN score ELSE NULL END) AS exam4
    FROM exams
    GROUP BY name;
    +--------+-----------+-----------+-----------+------------+
    |   name |    exam1  |    exam2  |    exam3  |    exam4   |
    +--------+-----------+-----------+-----------+------------+
    |   Bob  |     70    |     77    |     71    |     70     |
    |   Sue  |     89    |     87    |     88    |     89     |
    +--------+-----------+-----------+-----------+------------+
    

    上記のクエリは、上記のIF条件を使用するクエリと同様に機能します。データをピボットする列、つまり nameでグループ化する必要があります。 。また、試験ごとに個別の列を作成するため、試験番号ごとに1つのCASEステートメントを定義する必要があります。

    ピボットテーブルで試験のスコアを組み合わせることもできます。たとえば、exam1とexam2のスコアを合計して同じ列に表示する場合は、次のクエリを使用できます。

    SELECT name,
    sum(CASE WHEN exam=1 or exam=2 THEN score ELSE NULL END) AS exam12,
    sum(CASE WHEN exam=3 THEN score ELSE NULL END) AS exam3,
    sum(CASE WHEN exam=4 THEN score ELSE NULL END) AS exam4
    FROM exams
    GROUP BY name;
    +--------+------------+-----------+-----------+------------+
    |   name |    exam12  |    exam2  |    exam3  |    exam4   |
    +--------+------------+-----------+-----------+------------+
    |   Bob  |     147    |     77    |     71    |     70     |
    |   Sue  |     176    |     87    |     88    |     89     |
    +--------+------------+-----------+-----------+------------+
    

    上記の表では、1番目のCASEステートメントの条件を変更し、2番目のCASEステートメントを削除するだけで、試験1と試験2のスコアが追加され、1列のexam12に表示されています。

    MySQLでピボットテーブルを作成するための要件に従って、上記のクエリをカスタマイズできます。レポートツールを使用して、結果をテーブルにプロットすることもできます。 Ubiqを使用して作成されたテーブルの例を次に示します。

    ドラッグアンドドロップするだけでUbiqでピボットテーブルを作成できることをご存知ですか?

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

    1. ORA-24408:一意のサーバー・グループ名を生成できませんでした

    2. PostgreSQLクエリキャッシングと負荷分散の概要

    3. ROW_NUMBER()を使用するにはどうすればよいですか?

    4. Oracleの明示カーソルと暗黙カーソルの違いは何ですか?