MySQL实现行列转换
作者:小旭2021 时间:2024-01-18 20:56:17
实际应用中,会遇到需要把表的某些行转换成列,或者把列转换成行的情况。比如一张表在数据库中是这样的:
图1
但是,需要的结果可能是这样:
图2
这个时候就得行列转换了。
1.行转列的几种方法
1.1 case... when ... then ... else ... end
select uname,uid, -- 正常查询的字段
sum(
case
when course ='英语' then score -- 需要转换的字段
else 0
end) '英语',
sum(
case
when course= '物理' then score
else 0
end) '物理',
sum(
case
when course='化学' then score
else 0
end) '化学'
from course
group by uid
另一种写法:
case course
when '化学' then score
else 0
end
另外若省略‘else 0‘,则没有该课程的同学的分数会填充为null; sum替换成max结果一样。
1.2 if (`字段名1`=‘字段值’,,)
select uname,uid,
sum(if(`course`='英语',score,0)) '英语',
sum(if(`course`='物理',score,0)) '物理',
sum(if(`course`='化学',score,0)) '化学'
from course
group by uname
貌似比第一种方法简洁一些,所以下面的扩展是基于这种方法的~
以上两种转换方法结果相同,如图2。另外实际应用中还可能需要有总计的结果,如图3.
图3
total这一列简单,直接在之前的查询基础上加一个sum(score) 'total'即可;Total这一行则可以看成之前的查询不加group by而聚合成一行。因此可以看做是两个表组合到一起如图4和图5:
图4
图5
1.3 if (`字段名1`=‘字段值’,,) + union
把两个查询结果拼接到一起就是图3的样子了,代码如下:
select uid,uname,
sum(if(`course`='英语',score,0)) '英语',
sum(if(`course`='物理',score,0)) '物理',
sum(if(`course`='化学',score,0)) '化学',
sum(score) 'total'
from course
group by uname
union
select 'Total',null,
sum(if(`course`='英语',score,0)) '英语',
sum(if(`course`='物理',score,0)) '物理',
sum(if(`course`='化学',score,0)) '化学',
sum(score) 'total'
from course
1.4 if (`字段名1`=‘字段值’,,) + IFNULL()+with rollup
这种方法效果同1.3,
select ifnull(uid,'Total') uid, uname,
sum(if(`course`='英语',score,0)) '英语',
sum(if(`course`='物理',score,0)) '物理',
sum(if(`course`='化学',score,0)) '化学',
sum(score) 'total'
from course
group by uid
with ROLLUP
比1.3简洁一些,效率应该也高一点。with rollup和group by配套使用,会在已有的查询结果上再多出一行,对结果再聚合成一行,即图5的那一行,若不是数字类型,则返回最下面一行的数据,最后一行分组的字段会显示null,因此在配合ifnull()就可以了。
有瑕疵,想把它变成 null,有待完善。
2.列转行
列转行刚好和行转列情况相反,即:
数据库中存储的是这样
图2
而我们需要这样的结果
图1
没有在创建新表,暂且把这个视图当成新表吧
create view rtc as
select ifnull(uid,'Total') uid,uname,
sum(if(`course`='英语',score,0)) '英语',
sum(if(`course`='物理',score,0)) '物理',
sum(if(`course`='化学',score,0)) '化学',
sum(score) 'total'
from course
group by uid
with ROLLUP
-- 下面是列转行代码
select uid,uname,'英语' course,英语 score from rtc where uid <>'Total' and 英语>0
union all select uid,uname,'物理' ,物理 from rtc where uid <>'Total' and 物理>0
union all select uid,uname,'化学' ,化学 from rtc where uid <>'Total' and 化学>0
来源:https://www.cnblogs.com/chenyablog/p/15322573.html
标签:MySQL,行,列,转换
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Oracle学习笔记(五)
2012-01-05 18:52:30
Python通过pymysql调用MySQL进行增删改移查
2024-01-28 07:59:17
![](https://img.aspxhome.com/file/2023/2/79682_0s.png)
python中split()函数的用法详解
2022-01-13 14:52:06
![](https://img.aspxhome.com/file/2023/0/134660_0s.png)
最大限度优化你的Asp性能
2007-10-01 18:04:00
python 文件和路径操作函数小结
2023-02-11 18:11:36
vue中v-show和v-if的异同及v-show用法
2023-07-02 17:09:11
Python进阶-函数默认参数(详解)
2023-11-16 17:14:44
Django实现auth模块下的登录注册与注销功能
2022-03-06 17:49:15
![](https://img.aspxhome.com/file/2023/4/85124_0s.jpg)
两个不太常用的 CSS Hack
2008-06-27 12:49:00
Python list列表中删除多个重复元素操作示例
2023-08-23 06:49:04
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2024-04-22 22:24:59
tensorflow实现训练变量checkpoint的保存与读取
2023-12-15 18:10:33
![](https://img.aspxhome.com/file/2023/3/77003_0s.jpg)
javascript将数字转换整数金额大写的方法
2024-04-30 10:08:34
100行Python代码实现自动抢火车票(附源码)
2022-12-16 12:14:09
![](https://img.aspxhome.com/file/2023/7/91957_0s.jpg)
Python中使用支持向量机SVM实践
2022-03-17 16:14:21
网页设计之关于素材和言志
2008-03-23 13:46:00
![](https://img.aspxhome.com/file/UploadPic/20083/23/200832313514542s.gif)
vue移动端的左右滑动事件详解
2024-06-05 09:20:33
PHP图片库imagemagick安装方法
2023-11-16 18:54:38
解析MYSQL显示表信息的方法
2024-01-15 12:17:49
Python使用struct库的用法小结
2023-04-29 18:42:53