我有一个有3列(SID,SUBJECT,MARKS)的表:
??????????????????????????
? SID ? SUBJECT ? MARKS ?
??????????????????????????
? 1A01 ? ENG ? 66 ?
? 1A02 ? ENG ? 75 ?
? 1A01 ? MATH ? 60 ?
? 1A03 ? ENG ? 73 ?
? 1A02 ? MATH ? 35 ?
? 1A03 ? MATH ? 80 ?
? 1A01 ? CHI ? 65 ?
? 1A02 ? CHI ? 74 ?
? 1A03 ? CHI ? 78 ?
??????????????????????????
Run Code Online (Sandbox Code Playgroud)
我想通过每行中的SID对数据进行分组,如:
???????????????????????????
? SID ? CHI ? ENG ? MATH ?
???????????????????????????
? 1A01 ? 65 ? 66 ? 60 ?
? 1A02 ? 74 ? 75 ? 35 ?
? 1A03 ? 78 ? 73 ? 80 ?
???????????????????????????
Run Code Online (Sandbox Code Playgroud)
我是mysql的新手,我试图使用子查询和UNION,但它失败了.任何人都可以给我一些提示吗?
如果这3个是唯一的主题,您可以使用CASE测试Subject每个SID并使用聚合结果MAX().
SELECT SID,
MAX(CASE WHEN Subject = 'Chi' THEN Marks ELSE NULL END) `Chi`,
MAX(CASE WHEN Subject = 'Eng' THEN Marks ELSE NULL END) `Eng`,
MAX(CASE WHEN Subject = 'Math' THEN Marks ELSE NULL END) `Math`
FROM TableName
GROUP BY SID
Run Code Online (Sandbox Code Playgroud)
但如果你有数目不详的科目,则动态SQL,它使用PREPARE非常优选.
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;
Run Code Online (Sandbox Code Playgroud)
从两个查询输出
???????????????????????????
? SID ? CHI ? ENG ? MATH ?
???????????????????????????
? 1A01 ? 65 ? 66 ? 60 ?
? 1A02 ? 74 ? 75 ? 35 ?
? 1A03 ? 78 ? 73 ? 80 ?
???????????????????????????
Run Code Online (Sandbox Code Playgroud)