Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询字段作为列_Mysql_Sql_Select_Pivot - Fatal编程技术网

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感谢您的文章!!