MySQL行转列案例分析

建表:

成绩表:表名score,列名:学号、课程号、成绩

CREATE TABLE `score` (
  `s_id` varchar(20) NOT NULL,
  `c_id` varchar(20) NOT NULL,
  `s_score` int(3) DEFAULT NULL,
  PRIMARY KEY (`s_id`,`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据脚本:

insert into Score values('01' , '01' , 80);
insert into Score values('01' , '02' , 90);
insert into Score values('01' , '03' , 99);
insert into Score values('02' , '01' , 70);
insert into Score values('02' , '02' , 60);
insert into Score values('02' , '03' , 80);
insert into Score values('03' , '01' , 80);
insert into Score values('03' , '02' , 80);
insert into Score values('03' , '03' , 80);
insert into Score values('04' , '01' , 50);
insert into Score values('04' , '02' , 30);
insert into Score values('04' , '03' , 20);
insert into Score values('05' , '01' , 76);
insert into Score values('05' , '02' , 87);
insert into Score values('06' , '01' , 31);
insert into Score values('06' , '03' , 34);
insert into Score values('07' , '02' , 89);
insert into Score values('07' , '03' , 98);

表数据如下图:

要求将该表行转列形成以下结构:

思路:

1. 使用常量列输出目标表的结构
SELECT s_id, '01', '02', '03' from score;
2. 使用case when表达式,替换常量列为对应的成绩

遍历score每一行,遇到不同的cid,将其值利用case/when转换成对应列的成绩

select s_id,
(case c_id when '01' THEN s_score ELSE 0 end) as '01',
(case c_id when '02' then s_score ELSE 0 end) as '02',
(case c_id when '03' then s_score ELSE 0 end) as '03'
from score;

经过上述转换后和最终结果很接近,但是s_id存在很多重复行,可以将其聚合成一行数据,这时很容易想到使用s_id分组,同时我们需要取出c_id在相同s_id下最大值,填入新的行即可

3.分组,求最大值
select s_id,
max(case c_id WHEN '01' then s_score else 0 end) '01',
max(case c_id WHEN '02' then s_score else 0 end) '02',
max(case c_id WHEN '03' then s_score else 0 end) '03'
FROM score
GROUP BY s_id

最后得到上面要求的结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值