0

我有一个包含 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 但失败了。谁能给我一些提示?

4

1 回答 1

5

如果这 3 个是唯一的主题,您可以使用CASE来测试Subjectfor eachSID并使用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

但是,如果您有未知数量的主题,那么使用动态SQLPREPARE是更可取的。

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 ║
╚══════╩═════╩═════╩══════╝
于 2013-04-01T12:50:18.487 回答