欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

有趣的SQL(三)行转列,列转行和复制

程序员文章站 2022-07-06 10:10:57
本文节选自松华老师《SQL优化专栏》想阅读更多内容请点击订阅专栏今天,给大家带来的案例是,列转行和复制的相关案例。但介绍之前,我们先简单的学习下,行转列,列转行行转列,顾......
本文节选自松华老师《SQL优化专栏》

想阅读更多内容请点击订阅专栏

有趣的SQL(三)行转列,列转行和复制



今天,给大家带来的案例是,列转行和复制的相关案例。

但介绍之前,我们先简单的学习下,行转列,列转行

行转列,顾名思义,就是把几行数据变成一行或多行。

前提条件是,需要group by

有趣的SQL(三)行转列,列转行和复制


如上,数据,我们把两行数据,变成一行。

下面的SQL 是根据emp_no的不同,把两行数据变成了一行

有趣的SQL(三)行转列,列转行和复制


行转列的,最重要的一点是有个可以识别的列,这里是emp_no

还有就是,聚合函数和,case when 语句。

现在把行转列,之后的数据变成,两行数据的过程,叫做列转行。

有趣的SQL(三)行转列,列转行和复制


如上面SQL 我们想把一行数据变成2行,需要有个2行数据的中间表,

然后进行笛卡尔积,在此基础上通过case when 语句变成我们想要的结果

有趣的SQL(三)行转列,列转行和复制


以上就是,简单的行转列和列转行

我们在上面的,列转行的过程中,应用了复制的概念

需求如下

有如下两个表

有趣的SQL(三)行转列,列转行和复制


想得到如下结果

有趣的SQL(三)行转列,列转行和复制


我们从结果中,可以看出根据fn_a2的值,会复制那么多行,且fn_b1和fn_b2值显示一次,是根据fn_b3=1等于1的时候,fn_b3是根据fn_a2的值的大小,从1开始增大到fn_a2为止

有趣的SQL(三)行转列,列转行和复制


从上面的SQL中,我们利用一个c 表,把a 表进行复制,复制的大小跟nf_a2的值一样

在这个基础上,我们只需要left outer join Table_b 表就行了

有趣的SQL(三)行转列,列转行和复制


这个跟我们的最后的结果只差一步了,就是fn_b1,fn_b2 显示的有点多了

我们只需要在fn_b3=1的时候显示就行了

有趣的SQL(三)行转列,列转行和复制


这样我们就得到了,我们想要的结果,这里还有个小瑕疵的话就是null

这个可以用ifnull函数替换就可以

有趣的SQL(三)行转列,列转行和复制


这样就跟需求一样。

我们平时,会碰到各种奇葩需求,但是我们不用烦恼,SQL如同解数学题一样,只要掌握核心部分,剩下的就迎刃而解。

谢谢大家~ 欢迎转发

我是知数堂SQL优化班老师 - 郑松华

如有关于SQL优化方面疑问需要交流的,请加入QQ群579036588),@骑兔子的龟 就可与我联系


END




点击下图小程序订阅 《SQL优化专栏》 get更多优化技能

有趣的SQL(三)行转列,列转行和复制


有趣的SQL(三)行转列,列转行和复制




有趣的SQL(三)行转列,列转行和复制


扫码加入MySQL技术Q群

(群号:579036588)

   有趣的SQL(三)行转列,列转行和复制



本文地址:https://blog.csdn.net/n88Lpo/article/details/98320124