有趣的SQL(三)行转列,列转行和复制
本文节选自松华老师《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
这里有好课,为职场助攻
扫码加入MySQL技术Q群
(群号:579036588)