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

Mysql列を行に変換(ピボットテーブル)

    最初にデータのピボットを解除してからピボットする必要があります。ただし、残念ながらMySQLにはこれらの関数がないため、UNION ALLを使用してそれらを複製する必要があります。 CASEを使用してピボット解除関数と集計関数をクエリします ピボット用。

    unpivotまたはUNION ALL pieceは、col1、col2などからデータを取得し、それを複数の行に変換します。

    select id, month, col1 value, 'col1' descrip
    from yourtable
    union all
    select id, month, col2 value, 'col2' descrip
    from yourtable
    union all
    select id, month, col3 value, 'col3' descrip
    from yourtable
    union all
    select id, month, col4 value, 'col4' descrip
    from yourtable
    

    SQL Fiddle withDemo を参照してください。 。

    結果:

    |  ID | MONTH |  VALUE | DESCRIP |
    ----------------------------------
    | 101 |   Jan |      A |    col1 |
    | 102 |   feb |      C |    col1 |
    | 101 |   Jan |      B |    col2 |
    | 102 |   feb |      A |    col2 |
    | 101 |   Jan | (null) |    col3 |
    | 102 |   feb |      G |    col3 |
    | 101 |   Jan |      B |    col4 |
    | 102 |   feb |      E |    col4 |
    

    次に、これをサブクエリでラップして、集計とCASEを適用します。 これを希望の形式に変換するには:

    select descrip, 
      max(case when month = 'jan' then value else 0 end) jan,
      max(case when month = 'feb' then value else 0 end) feb
    from
    (
      select id, month, col1 value, 'col1' descrip
      from yourtable
      union all
      select id, month, col2 value, 'col2' descrip
      from yourtable
      union all
      select id, month, col3 value, 'col3' descrip
      from yourtable
      union all
      select id, month, col4 value, 'col4' descrip
      from yourtable
    ) src
    group by descrip
    

    SQL Fiddle withdemo を参照してください。

    結果は次のとおりです。

    | DESCRIP | JAN | FEB |
    -----------------------
    |    col1 |   A |   C |
    |    col2 |   B |   A |
    |    col3 |   0 |   G |
    |    col4 |   B |   E |
    


    1. ODBC4.0

    2. Djangoは多くのテーブルへの1つの外部キーをモデル化します

    3. SQLサーバーでUTCミリ秒をDATETIMEに変換する

    4. PostgreSQLでテーブルの列を別のテーブルの列で更新​​します