Mysql SQL查询字段作为列
我真的不知道怎么说,但请检查下面的细节 学生Mysql SQL查询字段作为列,mysql,sql,select,pivot,Mysql,Sql,Select,Pivot,我真的不知道怎么说,但请检查下面的细节 学生 |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 |
|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
现在,我一直在艰难地完成这项工作,首先用列名填充一个未绑定的数据网格,然后是学生名,然后为每个学生名添加详细信息。这很耗时,我想更好地优化查询
提前谢谢。试试看
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
如果你有已知数量的主题,@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;
请参见谢谢,我会将此合并到我正在做的事情中,并将结果反馈给您。我注意到您在查询中预定义了主题名称,系统可以添加比上面给出的更多的主题。有没有办法不进行预定义查询?对不起我的英语。好的,这解决了我的问题,我只需要玩一下。谢谢。我通过.net获取列名计数,然后用另一个数据集填充它,从而成功地处理了@John的答案。然后我继续用这些行填充另一个数据集。但你的回答令人惊讶。哇,只是哇。谢谢。@bluefeet,我已经设法使用了你的答案并将其转换为存储过程。非常感谢。@bluefeet感谢您的文章!!