2 column数据构成主键的表转化为1 column为主键的表

本文介绍了一种将学生成绩表从长格式转换为宽格式的方法。通过使用SQL的CASE WHEN语句配合SUM函数,实现了将包含学生姓名、课程及分数的成绩表按姓名汇总,并将各科成绩作为独立列展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
张三 德语 null
李四 语文 74
李四 数学 84
李四 物理 94
李四 英语 80
想变成(得到如下结果): 
姓名 语文 数学 物理 英语 德语
---- ---- ---- ----
李四 74   84   94  ? 60
张三 74   83   93  80 ?

这里name和course确定唯一一条记录,作为主键。

转化后只有name作为主键,另一个主键的具体值被作字段,不难理解,一个横坐标course值和一个纵坐标name值可以唯一确定一条记录。

 

下面使用case when来实现

 

select name,
sum(case when course='let' then score else 0 end) let,
sum(case when course='math' then score else 0 end) math,
sum(case when course='phy' then score else 0 end) phy,
sum(case when course='eng' then score else 0 end) eng,
sum(case when course='ger' then score else 0 end) ger
from grade
group by name

 

此处sum函数可以替换为max(),使用函数的目的是使用casewhen语句来生成一个列。

casewhen简单解释:根据name和course找到score值填充表,如果为空则置为0;

group by为必须要的语句,不然记录只有一条,name为表的第一条·记录的name。

执行后的结果为

 

转载于:https://www.cnblogs.com/yangwei20160911/p/6213089.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值