0


SQL中怎么将行转成列?

文章目录

天天这需求就神奇!!!!

SQL中怎么将行转成列?

我们以MySQL数据库为例,来说明行转列的实现方式。
首先,假设我们有一张分数表(tb_score),表中的数据如下图:

在这里插入图片描述
然后,我们再来看一下转换之后需要得到的结果,如下图:

在这里插入图片描述
可以看出,这里行转列是将原来的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 tb_score 
GROUP BY userid

注意,SUM() 是为了能够使用

GROUP BY

根据userid进行分组,因为每一个userid对应的
subject="语文"的记录只有一条,所以SUM() 的值就等于对应那一条记录的score的值。假如

userid ='001' and subject='语文' 

的记录有两条,则此时SUM() 的值将会是这两条记录的和,同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,一个user对应一个subject只有一个分数,因此可以使用

SUM()、MAX()、MIN()、AVG()

等聚合函数都可以达到行转列的效果。

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 tb_score 
GROUP BY userid

注意,

IF(subject='语文',score,0) 

作为条件,即对所有subject='语文’的记录的score字段进行

SUM()、MAX()、MIN()、AVG()

操作,如果score没有值则默认为0。

标签: sql 数据库

本文转载自: https://blog.csdn.net/weixin_45525272/article/details/126477777
版权归原作者 杨 戬 所有, 如有侵权,请联系我们删除。

“SQL中怎么将行转成列?”的评论:

还没有评论