我有一个包含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但它失败了。 有人可以给我一些提示吗?
答案 0 :(得分:5)
如果这3个是唯一的主题,您可以使用CASE
测试每个Subject
的{{1}},并使用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
的动态SQL 是首选。
PREPARE
来自两个查询的OUTPUT
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;