查看原文
其他

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

郑松华 知数堂 2023-03-11
本文节选自松华老师《SQL优化专栏》

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



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

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

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

前提条件是,需要group by


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

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


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

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

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


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

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


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

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

需求如下

有如下两个表


想得到如下结果


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


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

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


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

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


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

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


这样就跟需求一样。

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

谢谢大家~ 欢迎转发

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

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


END



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






这里有好课,为职场助攻

免费兑换知数堂的课程和周边,戳此了解




扫码加入MySQL技术Q群

(群号:579036588)

   


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存