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

MySQLを使用したピボットテーブル

    ピボットするために MySQLのデータの場合、集計関数とCASEの両方を使用する必要があります 表現。

    既知の列数がある場合は、クエリをハードコーディングできます。

    select p.postid,
      max(case when t.tagname = 'Incident' then p.value end) Incident,
      max(case when t.tagname = 'Location' then p.value end) Location,
      max(case when t.tagname = 'Weapon' then p.value end) Weapon
    from triples p
    left join tags t
      on p.tagid = t.id
    group by p.postid;
    

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

    ただし、列の数が不明な場合は、プリペアドステートメントを使用して動的SQLを生成する必要があります。

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(CASE WHEN TagName = ''',
          TagName,
          ''' THEN p.value END) AS `',
          TagName, '`'
        )
      ) INTO @sql
    FROM tags;
    
    
    SET @sql 
      = CONCAT('SELECT p.postid, ', @sql, ' 
               from triples p
               left join tags t
                 on p.tagid = t.id
               group by p.postid');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

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

    どちらも結果が得られます:

    | POSTID | INCIDENT |      LOCATION | WEAPON |
    ----------------------------------------------
    |      1 |   Murder | New Brunswick | (null) |
    |      2 |    Theft |        (null) |    Gun |
    



    1. OraclesqlQueryのJoinで削除

    2. OracleのSQLクエリからの結果を連結します

    3. jsonをキャッシュするための最良の方法

    4. mysqlデータベースにhtmlコンテンツを保存する