MySQL实现行列转换


当前第2页 返回上一页

图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

到此这篇关于MySQL实现行列转换的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。

更多Mysql内容来自木庄网络博客


标签:Mysql

返回前面的内容

相关阅读 >>

jdbc如何连接mysql数据库?

navicat连接mysql时报错1251怎么办

如何利用cmd连接本机mysql数据库

关于mysql元数据如何生成hive建表语句注释脚本

如何防止sql注入攻击?

彻底删除mysql步骤介绍

mysql的字符集操作命令总结

mysql如何计算相邻两行某列差值

mysql的加密方法

mysql的注释有几种写法?

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...