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

動的列の行への転置

    MySQLにはUNPIVOT関数はありませんが、UNION ALLを使用して列を行に変換できます。 。

    基本的な構文は次のとおりです。

    select id, word, qty
    from
    (
      select id, 'abc' word, abc qty
      from yt
      where abc > 0
      union all
      select id, 'brt', brt
      from yt
      where brt > 0
    ) d
    order by id;
    

    あなたの場合、動的列のソリューションが必要であると述べています。その場合は、プリペアドステートメントを使用して動的SQLを生成する必要があります。

    SET @sql = NULL;
    
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'select id, ''',
          c.column_name,
          ''' as word, ',
          c.column_name,
          ' as qty 
          from yt 
          where ',
          c.column_name,
          ' > 0'
        ) SEPARATOR ' UNION ALL '
      ) INTO @sql
    FROM information_schema.columns c
    where c.table_name = 'yt'
      and c.column_name not in ('id')
    order by c.ordinal_position;
    
    SET @sql 
      = CONCAT('select id, word, qty
               from
               (', @sql, ') x  order by id');
    
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

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



    1. T-SQL:動的SQLでパラメーターを使用する方法は?

    2. PostgreSQLエラーログをデコードする方法

    3. MySQLストレージエンジンの最適化:高性能のためのInnoDB最適化の構成

    4. GTTテーブル統計とSYS.WRI$_OPTSTAT_TAB_HISTORY