--行列转换
select *
from demo
select *
from kecheng
┌行转列
└列转行
--行转列
select id,name,
max(case when course='语文' then score end) 语文,
max(case when course='数学' then score end) 数学,
max(case when course='英语' then score end) 英语,
max(case when course='历史' then score end) 历史,
max(case when course='化学' then score end) 化学
from kecheng
group by id,name
order by id
参考:
select * from kecheng
--把kecheng表的course列行转列
--id,name肯定是要有的
select id,name,score --这样看我们拿到的是score列的全部值,不能达到我们的目标,我们观察我们的目标结果集,是不是没有单独的score这个列,
from kecheng --而是有course列中的元素,语文数学这些,那我们怎样才能将原来score列中的数据放到这些中呢,看到这个,分类讨论就想到了case when
↓
select id,name
sum(case course when '语文' then score end) 语文 --可以看到这样的结果集还是和我们想要的还有点不样,首先你们看这个列就非常的不美观,和我们目标差距很大,
,case course when '数学' then score end 数学 --这种情况我们一般都怎么处理来改变列名,给他们取个别名,按照目标结果集的样子来照葫芦画瓢,我们在运行一下,
,case course when '英语' then score end 英语 --是不是发现每个人的名字还是出现了很多次,而且仔细看看能发现,同样的名字在每一行都只有一个列中值,遇到多条数据累赘的时候,
,case course when '历史' then score end 历史 --我们应该想到聚合函数,向我们以前遇到的10部门有多少人,这里我们看目标结果是不是名字只有唯一值,那我们就可以用聚合函数把重复的多个名字聚合成一个名字
,case course when '化学' then score end 化学
from kecheng
↓
select id,name
sum(case course when '语文' then score end) 语文 --这里报错了,聚合函数的查询列只能是聚合的列和用来聚合的列,我们这里只有用来聚合的列那这些case我们是不是该给他们处理成聚合的列,
,case course when '数学' then score end 数学 --从刚才的结果集看来,同一个id下的同一课成绩是不是只有一个数值,所以我们对他进行sum,min