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

列名の動的行データを使用してテーブルを再構築するSQLクエリ

    これは基本的にPIVOT ただし、MySQLにはPIVOT機能がありません。したがって、集計関数とCASEを使用してこれを複製する必要があります。 声明。 Grantの数がわかっている場合 持っている値は、次のようにクエリをハードコーディングできます:

    select 
      Month,
      sum(case when `grant`='DOE' then subtotal else 0 end) DOE,
      sum(case when `grant`='Hatch' then subtotal else 0 end) Hatch,
      sum(case when `grant`='NIH' then subtotal else 0 end) NIH,
      sum(case when `grant`='NSF' then subtotal else 0 end) NSF,
      sum(case when `grant`='Other' then subtotal else 0 end) Other,
      sum(case when `grant`='State' then subtotal else 0 end) State
    from yourtable
    group by month
    

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

    ここで、Grantの値の数が不明な場合 、次に、プリペアドステートメントを使用して、このクエリの動的バージョンを生成できます。

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'sum(case when `Grant` = ''',
          `Grant`,
          ''' then Subtotal else 0 end) AS `',
          `Grant`, '`'
        )
      ) INTO @sql
    FROM yourtable;
    
    
    SET @sql = CONCAT('SELECT month, ', @sql, ' 
                      FROM yourtable 
                      group by month');
    
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

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

    どちらも同じ結果になります:

    |    MONTH |  HATCH |   NIH |    NSF |  OTHER |    DOE |  STATE |
    -----------------------------------------------------------------
    | Nov-2012 | 144.56 | 240.9 |  100.7 | 276.67 |      0 |      0 |
    | Oct-2012 | 321.54 |     0 | 234.53 | 312.35 | 214.35 |      0 |
    | Sep-2012 | 147.99 |     0 | 156.89 | 245.67 |      0 | 148.66 |
    



    1. INTとUnique-データベースのIDフィールドの識別子

    2. InnoDBのAuto_increment値?

    3. 合成データの生成

    4. SQLで行を削除する方法