4

入れ方がよくわかりませんが、以下の詳細をご確認ください。

学生

|Student_ID|Student_Name|
|1         |Ryan        |
|2         |Camille     |
|3         |George      |

学年

|Student_ID|Subject |Grade
|1         |Math    |5 
|1         |English |3 
|1         |History |1
|2         |Math    |3 
|2         |English |4 
|2         |History |1 
|3         |Math    |5 
|3         |English |1 
|3         |History |2 

この結果を得ることができますか?

Student_Name|Math|English|History
Ryan        |5   |3      |1
Camille     |3   |4      |1
George      |5   |1      |2

これは、バインドされていないデータグリッドに最初に列名、次に生徒名を入力し、次に各生徒名の詳細を追加することで、これを困難にしています。これには時間がかかるので、クエリをより適切に最適化したいと思います。

前もって感謝します。

4

2 に答える 2

11

試す、

SELECT  a.Student_name,
        MAX(CASE WHEN subject = 'MATH' THEN grade ELSE NULL END) MathGrade,
        MAX(CASE WHEN subject = 'ENGLISH' THEN grade ELSE NULL END) EnglishGrade,
        MAX(CASE WHEN subject = 'History' THEN grade ELSE NULL END) HistoryGrade
FROM    Student a
        LEFT JOIN Grade b
            ON a.Student_ID = b.Student_ID
GROUP BY a.Student_name

SQLFiddleデモ

于 2012-10-01T04:58:39.040 に答える
3

@Johnの答えは、サブジェクトの数がわかっている場合は機能しますが、サブジェクトの数が不明な場合は、プリペアドステートメントを使用してこれを動的に生成できます。ここに良い記事があります:

動的ピボットテーブル(行を列に変換)

コードは次のようになります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(case when Subject = ''',
      Subject,
      ''' then Grade end) AS ',
      Subject
    )
  ) INTO @sql
FROM grade;

SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' 
                   FROM student s
                   LEFT JOIN grade AS g 
                    ON s.student_id = g.student_id
                   GROUP BY s.Student_name');

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

SQL FiddleWithDemoを参照してください

于 2012-10-01T14:25:55.367 に答える