我有一个包含 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 ║
╚══════╩═════════╩═══════╝
我想按每行中的 SID 对数据进行分组,例如:
╔══════╦═════╦═════╦══════╗
║ SID ║ CHI ║ ENG ║ MATH ║
╠══════╬═════╬═════╬══════╣
║ 1A01 ║ 65 ║ 66 ║ 60 ║
║ 1A02 ║ 74 ║ 75 ║ 35 ║
║ 1A03 ║ 78 ║ 73 ║ 80 ║
╚══════╩═════╩═════╩══════╝
我是 mysql 的新手,我尝试使用子查询和 UNION 但失败了。 谁能给我一些提示?
最佳答案
如果只有这 3 个主题,您可以使用 CASE
测试每个 SID
的 Subject
并使用 聚合结果>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
但是,如果您的主题数量未知,那么使用 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;
OUTPUT 来自两个查询
╔══════╦═════╦═════╦══════╗
║ SID ║ CHI ║ ENG ║ MATH ║
╠══════╬═════╬═════╬══════╣
║ 1A01 ║ 65 ║ 66 ║ 60 ║
║ 1A02 ║ 74 ║ 75 ║ 35 ║
║ 1A03 ║ 78 ║ 73 ║ 80 ║
╚══════╩═════╩═════╩══════╝
关于mysql - 如何将不同 WHERE 条件下的数据排列到不同的列中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15743734/