如何将不同WHERE条件下的数据排列到不同的列中?

时间:2013-04-01 12:44:42

标签: mysql sql select pivot

我有一个包含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但它失败了。 有人可以给我一些提示吗?

1 个答案:

答案 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;