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

MySQLまたはPHP行を列に変換する

    年ごとに個別の列を作成する場合は、年を追加する必要があります(列のdateから計算) )動的SQLコードへ:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
    BEGIN
      SET group_concat_max_len=2048;
      SET @sql = NULL;
    
      SELECT GROUP_CONCAT(DISTINCT CONCAT(
          'MAX(IF(month = ''',
          month,
          ''' and year(date) = ',
          year(date),
          ', amount, NULL)) AS `',
          month,
          '_',
          year(date),
          '`'
        )
        order by date
      ) INTO @sql
      FROM tmp_results;
    
      if coalesce(@sql,'') != '' then
        set @sql = concat(', ', @sql);
      end if; 
    
      SET @sql = CONCAT(
        'SELECT r.account, 
         r.region ',  
         coalesce(@sql,''),
        ' FROM tmp_results r
         LEFT JOIN accounts AS a
         on r.account_id = a.id
         GROUP BY r.account, r.region');
    
      PREPARE stmt FROM @sql;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
    END
    

    列の名前はJanuary_2017のようになります。 、およびorder by dateを追加しました 、そうでない場合、通常は順序付けされていません。

    group by r.regionを追加しました 、それ以外の場合は、only_full_group_byの場合は機能しません サーバーで有効になっています(これはMySQL 5.7以降のデフォルト値です)。

    そして、空のテーブルのテストを追加しました(そうしないとエラーが発生します)。それが不要で、私のコードの一部だけを自分のコードにコピーする場合は、r.regionの後にコンマがないことに注意してください。 SET @sql = CONCAT('SELECT r.account, r.region ' コードと比較すると、コードを再度追加する必要がある場合があります。

    毎月のコードの長さは約80なので、group_concat_max_lenを増やす必要がある場合があります 可能な限り最大のクエリに合わせます。




    1. MySqlクエリの結果は1日中

    2. ハイブリッドSQLServer環境に詳細な診断を提供する世界初のSaaSプラットフォームの紹介

    3. Pythonを使用してアラビア語のテキストをmysqlデータベースに保存する方法は?

    4. MariaDBでサブストリングを置き換える2つの方法