1

私は次のようなテーブルを持っています

ID    Student    Exam
----------------------  
1      Kavi      BE       
2      MGR       BA      
3      MGR1      BE  

このデータをExcel形式で書いています。問題は、試験フィールドを列ごとにする必要があることです。

BE      BA 
-------------
Kavi    NULL 
NULL    MGR
MGR1    NULL

列単位のデータを印刷するようにExcelクラスを変更できないため、これはクエリでのみ行う必要があります。

グループ連結を使用しましたが、試験の詳細を同じ列ではなく別の列にする必要があります。mysql のいくつかのバージョンではサポートされていないため、ピボットを使用しないでください。助けてください。

注: このテーブルにはレコードと同じ数のレコードが含まれる場合があるため、pls は動的に機能するソリューションを提供します。

4

1 に答える 1

1

MySQL には PIVOT 関数がないため、結果を取得するには CASE 式で集計関数を使用する必要があります。

select
  max(case when exam = 'BE' then student end) BE,
  max(case when exam = 'BA' then student end) BA
from yourtable
group by id;

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

値の数が不明な場合はexam、動的 SQL で準備済みステートメントを使用することを検討する必要があります。コードは次のようになります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when exam = ''',
      exam,
      ''' then student end) AS `',
      exam, '`'
    )
  ) INTO @sql
from yourtable;

SET @sql 
    = CONCAT('SELECT ', @sql, ' 
              from yourtable
              group by id;');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL Fiddle with demoを参照してください。両方のバージョンで結果が得られます。

|     BE |     BA |
|   Kavi | (null) |
| (null) |    MGR |
|   MGR1 | (null) |
于 2013-09-16T16:52:28.917 に答える