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

SQLステートメント-SQLマトリックス

    ピボットできる方法は2つあります。 MySQLのデータ。事前に値を知っている場合(チーム)、値をハードコーディングするか、プリペアドステートメントを使用して動的SQLを生成できます。

    静的バージョンは次のようになります:

    select TeamA,
      max(case when TeamB = 'A' then won - lost else 0 end) as A,
      max(case when TeamB = 'B' then won - lost else 0 end) as B,
      max(case when TeamB = 'C' then won - lost else 0 end) as C,
      max(case when TeamB = 'D' then won - lost else 0 end) as D,
      max(case when TeamB = 'E' then won - lost else 0 end) as E
    from yourtable
    group by TeamA;
    

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

    プリペアドステートメントで動的バージョンを使用する場合、コードは次のようになります。

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'MAX(CASE WHEN TeamB = ''',
          TeamB,
          ''' THEN won - lost else 0 END) AS `',
          TeamB, '`'
        )
      ) INTO @sql
    from
    (
      select *
      from yourtable
      order by teamb
    ) x;
    
    SET @sql 
      = CONCAT('SELECT TeamA, ', @sql, ' 
               from yourtable
               group by TeamA');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

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

    編集#1、これについて考えた後、私は実際にこれを少し異なる方法で行います。チームが行と列の両方に表示されたデータの真のマトリックスを生成します。これを行うには、最初にUNION ALLを使用します 2つの列にすべてのチームを取得するためのクエリ:

    select teama Team1, teamb Team2,
      won-lost Total
    from yourtable
    union all
    select teamb, teama,
      won-lost
    from yourtable
    

    SQL Fiddle withDemo を参照してください。 。それが完了したら、ピボットします。 データ:

    select Team1,
      coalesce(max(case when Team2 = 'A' then Total end), 0) as A,
      coalesce(max(case when Team2 = 'B' then Total end), 0) as B,
      coalesce(max(case when Team2 = 'C' then Total end), 0) as C,
      coalesce(max(case when Team2 = 'D' then Total end), 0) as D,
      coalesce(max(case when Team2 = 'E' then Total end), 0) as E
    from
    (
      select teama Team1, teamb Team2,
        won-lost Total
      from yourtable
      union all
      select teamb, teama,
        won-lost
      from yourtable
    ) src
    group by Team1;
    

    SQL Fiddle withDemo を参照してください。 。これにより、次のより詳細な結果が得られます:

    | TEAM1 |  A | B |  C | D | E |
    -------------------------------
    |     A |  0 | 2 | -2 | 8 | 0 |
    |     B |  2 | 0 |  0 | 0 | 0 |
    |     C | -2 | 0 |  0 | 0 | 0 |
    |     D |  8 | 0 |  0 | 0 | 0 |
    |     E |  0 | 0 |  0 | 0 | 0 |
    


    1. idが一致する場合にmysqlから行を選択する

    2. Oracleデータベースに接続しているすべてのセッションを強制終了するにはどうすればよいですか?

    3. PostgreSQL9.2でテーブルをロックせずにデータベース行を更新する

    4. 多言語PHPウェブサイトのための最も効率的なアプローチ