Mysql 如何按不同的WHERE条件将数据排列到不同的列中?

Mysql 如何按不同的WHERE条件将数据排列到不同的列中?,mysql,sql,select,pivot,Mysql,Sql,Select,Pivot,我的表有3列(SID、主题、标记): 我想按每行中的SID对数据进行分组,如下所示: ╔══════╦═════╦═════╦══════╗ ║ SID ║ CHI ║ ENG ║ MATH ║ ╠══════╬═════╬═════╬══════╣ ║ 1A01 ║ 65 ║ 66 ║ 60 ║ ║ 1A02 ║ 74 ║ 75 ║ 35 ║ ║ 1A03 ║ 78 ║ 73 ║ 80 ║ ╚══════╩═════╩═════╩══════╝ 我是mysql新手,

我的表有3列(SID、主题、标记):

我想按每行中的SID对数据进行分组,如下所示:

╔══════╦═════╦═════╦══════╗
║ SID  ║ CHI ║ ENG ║ MATH ║
╠══════╬═════╬═════╬══════╣
║ 1A01 ║  65 ║  66 ║   60 ║
║ 1A02 ║  74 ║  75 ║   35 ║
║ 1A03 ║  78 ║  73 ║   80 ║
╚══════╩═════╩═════╩══════╝
我是mysql新手,我尝试使用子查询和联合,但失败了。
有人能给我一些提示吗?

如果这三个是唯一的主题,您可以使用
CASE
对每个
SID
测试
主题
,并使用
MAX()
聚合结果

但是,如果主题的数量未知,那么使用
PREPARE
的动态SQL将是首选

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN Subject = ''',
      Subject,
      ''' then Marks end) AS ',
      CONCAT('`', Subject,'`')
    )
  ) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT  SID, ', @sql, ' 
                    FROM    TableName
                    GROUP   BY SID');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
从两个查询中输出

╔══════╦═════╦═════╦══════╗
║ SID  ║ CHI ║ ENG ║ MATH ║
╠══════╬═════╬═════╬══════╣
║ 1A01 ║  65 ║  66 ║   60 ║
║ 1A02 ║  74 ║  75 ║   35 ║
║ 1A03 ║  78 ║  73 ║   80 ║
╚══════╩═════╩═════╩══════╝

如果只有这3个主题,则可以使用
CASE
对每个
SID
测试
主题
,并使用
MAX()
聚合结果

但是,如果主题的数量未知,那么使用
PREPARE
的动态SQL将是首选

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN Subject = ''',
      Subject,
      ''' then Marks end) AS ',
      CONCAT('`', Subject,'`')
    )
  ) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT  SID, ', @sql, ' 
                    FROM    TableName
                    GROUP   BY SID');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
从两个查询中输出

╔══════╦═════╦═════╦══════╗
║ SID  ║ CHI ║ ENG ║ MATH ║
╠══════╬═════╬═════╬══════╣
║ 1A01 ║  65 ║  66 ║   60 ║
║ 1A02 ║  74 ║  75 ║   35 ║
║ 1A03 ║  78 ║  73 ║   80 ║
╚══════╩═════╩═════╩══════╝
请参见数据透视表-,。请参见数据透视表-。