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

0 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 ?
??????????????????????????
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,但它失败了.任何人都可以给我一些提示吗?

Joh*_*Woo 5

如果这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)