Mysql 如何按不同的WHERE条件将数据排列到不同的列中?
我的表有3列(SID、主题、标记): 我想按每行中的SID对数据进行分组,如下所示: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新手,
╔══════╦═════╦═════╦══════╗
║ 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 ║
╚══════╩═════╩═════╩══════╝
请参见数据透视表-,。请参见数据透视表-。