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

行を動的な列数にピボットして、MySQLでサマリービューを作成します

    テーブルをピボットする必要がありますが、mysqlにはそのようなピボットの機能はありません

    そのため、その機能を複製する必要があります

    編集済み

    Select 
      group_concat(
        DISTINCT 
           if(year is null,
              CONCAT('max(if (year is null, state, 0)) as ''NULL'' '),
              CONCAT('max(if (year=''', year, ''', state, 0)) as ''',year, ''' '))
        ) into @sql from tbl join (SELECT @sql:='')a;
    set @sql = concat('select company_name, ', @sql, 'from tbl group by company_name;');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    

    結果

    | COMPANY_NAME | 2008 | 2009 | 2010 | NULL |
    --------------------------------------------
    |     companyA |    1 |    0 |    0 |    0 |
    |     companyB |    0 |    2 |    0 |    0 |
    |     companyC |    0 |    0 |    3 |    3 |
    

    SQL FIDDLE

    問題を解決するには2つのアプローチがあります1。毎年ケースを作成します。これは、year2を扱っているため、あなたのケースでは不可能です。クエリを動的に生成して、必要に応じて適切な列を取得できるようにします。

    クエリを生成して@sqlに保存する2番目のソリューションに従って、ソリューションを提供しました。 変数。フィドルでは、@sqlの内容を印刷しました 実行する前に。

    select company_name, max(if (year='2008', state, 0)) as '2008' ,max(if (year='2009', state, 0)) as '2009' ,max(if (year='2010', state, 0)) as '2010' ,max(if (year is null, state, 0)) as 'NULL' from tbl group by company_name; 
    

    group_concat()の詳細については リンクをたどる GROUP_CONCAT およびユーザー定義変数

    これがお役に立てば幸いです。



    1. SQLServerに先頭と末尾のゼロを追加する

    2. innobackupexを使用してリモートでバックアップを取る

    3. mysqlコマンドラインの表示設定を調整するにはどうすればよいですか?

    4. Zend Db/Mysql-Selectで挿入