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

MySQLでテーブルのピボットを解除する方法

    列を行に転置したり、MySQLでテーブルのピボットを解除したりする必要がある場合があります。 MySQLにはテーブルをUNPIVOTまたはREVERSEPIVOTする関数がないため、列を行に転置するSQLクエリを作成する必要があります。 MySQLでテーブルのピボットを解除する方法は次のとおりです。

    MySQLでテーブルのピボットを解除する方法

    次のピボットテーブルがあるとします

    mysql>create table data(id int, a varchar(255), b varchar(255), c varchar(255));
    mysql>insert into data(id,a,b,c) values(1,'a1','b1','c1'),(2,'a1','b1','c1');
    mysql>select * from data;
    
    +------+------+------+------+
    | id   | a    | b    | c    |
    +------+------+------+------+
    |    1 | a1   | b1   | c1   |
    |    2 | a1   | b1   | c1   |
    +------+------+------+------+
    

    MySQLのテーブルを次のようにピボット解除するとします。

    1 | a1 | a
    1 | b1 | b
    1 | c1 | c
    2 | a2 | a
    2 | b2 | b
    2 | c2 | c
    

    ボーナスリード:MySQLで動的ピボットテーブルを作成する方法

    MySQLのピボット解除テーブル

    SQLでアンピボットを実行するためのクエリは次のとおりです。 MySQLはUNPIVOT関数を提供していないため、MySQLでテーブルを逆ピボットするには、でUNIONALL句を使用する必要があります。

    mysql> select id, 'a' col, a value
          from data
          union all
          select id, 'b' col, b value
          from data
          union all
          select id, 'c' col, c value
          from data;
    +------+-----+-------+
    | id   | col | value |
    +------+-----+-------+
    |    1 | a   | a1    |
    |    2 | a   | a1    |
    |    1 | b   | b1    |
    |    2 | b   | b1    |
    |    1 | c   | c1    |
    |    2 | c   | c1    |
    +------+-----+-------+
    

    上記のクエリでは、基本的に元のテーブルを3つの小さなテーブルにカットします。1つは各列a、b、cに対応し、UNIONALLを使用してそれらを上下に追加します。

    行をフィルタリングする場合は、以下に示すようにWHERE句を追加できます

    mysql> select id, 'a' col, a value
          from data
          WHERE condition
          union all
          select id, 'b' col, b value
          from data
          WHERE condition
          union all
          select id, 'c' col, c value
          from data
          WHERE condition;
    

    ボーナスリード:MySQLで行を列に動的に転置する方法

    残念ながら、これは面倒ですが、MySQLでピボットを解除する2つの方法のうちの1つです。もう1つは、以下に示すように、クロス結合を実行することです。

    mysql> select t.id,
           c.col,
           case c.col
             when 'a' then a
             when 'b' then b
             when 'c' then c
           end as data
         from data t
         cross join
         (
           select 'a' as col
           union all select 'b'
           union all select 'c'
         ) c;
    +------+-----+------+
    | id   | col | data |
    +------+-----+------+
    |    1 | a   | a1   |
    |    2 | a   | a1   |
    |    1 | b   | b1   |
    |    2 | b   | b1   |
    |    1 | c   | c1   |
    |    2 | c   | c1   |
    +------+-----+------+
    

    ボーナスリード:MySQLでピボットテーブルクエリを自動化する方法

    WHERE句を使用して、MySQLでテーブルのピボットを解除するように上記のクエリをカスタマイズできます。レポートツールを使用して、結果をテーブルにプロットすることもできます。これは、Ubiqを使用して作成されたテーブルの例です。

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

    1. SQLWHERE複数の条件

    2. JSON_STORAGE_SIZE()–MySQLでJSONドキュメントのストレージサイズを検索する

    3. OracleでTABLEを切り捨てる方法

    4. SQL Serverで外部キーを作成するにはどうすればよいですか?