sql 列转行_有意思的SQL(3) 行转列,列转行和复制

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

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

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

前提条件是,需要group by

8ddd81a2a25bb94cd65a8a62b2a3613b.png

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

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

ba3ec2c8c5944396f537680e7714b0cc.png

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

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

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

24e8e937da80f9c569a78b0da2caf94f.png

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

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

49a350319efe124c2f96487baade6b2b.png

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

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

需求如下

有如下两个表

cf12bfb304587155dd493c7306a6450b.png

想得到如下结果

9f5f2113fad68dca641f68a13c016a1b.png

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

59f1a40ff3604c4fe472faebca4d9d4e.png

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

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

76afbadaea30736f7bd7583384f72d56.png

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

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

bbfd4b21ad289e649c5084708c0d3599.png

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

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

88598b09ba3720971379117511ec6338.png

这样就跟需求一样。

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

谢谢大家~ 欢饮转发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值