一尘不染

SQL查询字段作为列

sql

我真的不知道该如何放置,但请检查以下详细信息。

学生

|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

现在,我一直在努力地做到这一点,首先用列名,然后是学生名,然后添加每个学生名的详细信息来填充未绑定的数据网格。这很耗时,我想更好地优化查询。

提前致谢。


阅读 521

收藏
2021-03-17

共1个答案

一尘不染

虽然@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

2021-03-17