MySQL实现行列转换

 更新时间:2022年07月08日 10:29:09   作者:小旭2021  
这篇文章介绍了MySQL实现行列转换的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

实际应用中,会遇到需要把表的某些行转换成列,或者把列转换成行的情况。比如一张表在数据库中是这样的:

图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

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

相关文章

  • MySQL存储路径迁移的详细步骤

    MySQL存储路径迁移的详细步骤

    在构建Web应用程序时,MySQL是存储数据的核心工具,在云服务器上,正确设置MySQL的存储路径对应用性能至关重要,通过迁移,我们不仅解决了空间不足的问题,还能让数据库运行得更快,所以本文将给大家介绍MySQL存储路径迁移的详细步骤,需要的朋友可以参考下
    2024-06-06
  • mysql语句实现简单的增、删、改、查操作示例

    mysql语句实现简单的增、删、改、查操作示例

    这篇文章主要介绍了mysql语句实现简单的增、删、改、查操作,结合实例形式分析总结了mysql语句实现数据库与表的创建、删除以及增删改查等常见操作技巧,需要的朋友可以参考下
    2019-05-05
  • MySQL 常见时间字段设置小结

    MySQL 常见时间字段设置小结

    本文详细探讨了MySQL中常见时间字段的设置和处理,包括DATETIME、DATE、TIME和TIMESTAMP等类型的介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • mysql数据库重置表主键id的实现

    mysql数据库重置表主键id的实现

    在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • 快速理解MySQL中主键与外键的实例教程

    快速理解MySQL中主键与外键的实例教程

    这篇文章主要介绍了MySQL中主键与外键的区别和联系,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • 解决MySQL无法远程连接的方法

    解决MySQL无法远程连接的方法

    这篇文章主要介绍了解决MySQL无法远程连接的方法,文中给出的解决方案主要针对IP限制时出现的该种情况,需要的朋友可以参考下
    2015-04-04
  • mysql单表查询及多表查询命令详解

    mysql单表查询及多表查询命令详解

    这篇文章主要介绍了mysql单表查询及多表查询命令详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • MySQL如何查找树形结构中某个节点及其子节点

    MySQL如何查找树形结构中某个节点及其子节点

    这篇文章主要介绍了MySQL如何查找树形结构中某个节点及其子节点问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Mysql 中的多表连接和连接类型详解

    Mysql 中的多表连接和连接类型详解

    这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据组合在一起,从而进行更复杂的查询和分析,感兴趣的朋友一起看看吧
    2025-01-01
  • 与MSSQL对比学习MYSQL的心得(七)--查询

    与MSSQL对比学习MYSQL的心得(七)--查询

    在这个《与MSSQL对比学习MYSQL的心得》系列里面,我一直都把MYSQL跟SQLSERVER进行比较,相互进行比较是学习一样东西比较好的方法
    2014-08-08

最新评论