我真的不知道该如何放置,但请检查以下详细信息。
学生
|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
现在,我一直在努力地做到这一点,首先用列名,然后是学生名,然后添加每个学生名的详细信息来填充未绑定的数据网格。这很耗时,我想更好地优化查询。
提前致谢。
虽然@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 Fiddle