MySQL如何把行转换为列?

废话不多说,我们直接看一个例子:

MySQL如何把行转换为列?_第1张图片

这是我们建好的一张学生成绩表student_score,我们再来看一下转换之后需要得到的结果,如下图:

MySQL如何把行转换为列?_第2张图片

 可以看出,这里行转列是将原来的subject字段的多行内容选出来,作为结果集中的不同列,再根据userid进行分组再显示对应的score,我们一般有两种方法实现

1、使用 CASE...WHEN...THEN 语句

SELECT userid,
       SUM(CASE `subject` WHEN '语文' THEN score ELSE 0 END) as '语文',
       SUM(CASE `subject` WHEN '数学' THEN score ELSE 0 END) as '数学',
       SUM(CASE `subject` WHEN '英语' THEN score ELSE 0 END) as '英语',
       SUM(CASE `subject` WHEN '政治' THEN score ELSE 0 END) as '政治'  
FROM student_score
GROUP BY userid

例如CASE `subject` WHEN '语文’ THEN score ELSE 0 END这条语句,即对所有字段subject=`语文`进行SUM()操作,设置值为score,如果没有则设置为0

2、使用IF()函数

SELECT userid,
       SUM(IF(`subject`='语文',score,0)) as '语文',
       SUM(IF(`subject`='数学',score,0)) as '数学',
       SUM(IF(`subject`='英语',score,0)) as '英语',
       SUM(IF(`subject`='政治',score,0)) as '政治'
FROM student_score 
GROUP BY userid

IF(subject=`语文`,score,0)作为条件,即对所有subject=`语文`的记录的score字段进行SUM()操作,如果score没有值则默认为0。

注意:SUM() 是为了能够使用GROUP BY根据userid进行分组,因为每一个userid对应的subject="语文"的记录只有一条,所以SUM() 的值就等于对应那一条记录的score的值。假如userid ='001' and subject='语文' 的记录有两条,则此时SUM() 的值将会是这两条记录的和,同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,一个user对应一个subject只有一个分数,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。

你可能感兴趣的:(数据库,sql,数据库)