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

mySQLのクロス集計ビュー?

    このタイプのデータ変換は、PIVOTと呼ばれます。 MySQLにはピボット関数はありませんが、CASEで集計関数を使用できます。 結果を得るための式。

    clientsの名前の場合 が事前にわかっている場合は、クエリをハードコーディングできます:

    select s.playdate,
      sum(case when clname = 'Chris' then score end) Chris,
      sum(case when clname = 'Gale' then score end) Gale,
      sum(case when clname = 'Donna' then score end) Donna
    from clients c
    inner join scores s
      on c.clid = s.clid
    group by s.playdate;
    

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

    クライアントの数が不明な場合、またはコードを変更せずに含めたい新しいクライアントを追加する場合は、プリペアドステートメントを使用して動的SQLを生成できます。

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'sum(CASE WHEN clName = ''',
          clName,
          ''' THEN score else ''-'' END) AS `',
          clName, '`'
        )
      ) INTO @sql
    FROM clients;
    
    SET @sql 
      = CONCAT('SELECT s.playdate, ', @sql, ' 
                from clients c
                inner join scores s
                  on c.clid = s.clid
                group by s.playdate');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    SQL Fiddle withDemo を参照してください。 。どちらのクエリでも同じ結果が得られます。



    1. AndroidのSQLiteデータベースにJSONデータを挿入します

    2. SQLAlchemyでUnicode省略記号をmySQLテーブルに正しく挿入するにはどうすればよいですか?

    3. ツリー表現の階層パスを見つける方法

    4. 究極のMySQLレガシーデータベースの悪夢