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

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

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

前提条件是,需要group by

sql server 行转列 高性能 sql的列转行_数据


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

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

sql server 行转列 高性能 sql的列转行_SQL_02


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

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

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

sql server 行转列 高性能 sql的列转行_数据_03


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

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

sql server 行转列 高性能 sql的列转行_行转列_04


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

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

需求如下

有如下两个表

sql server 行转列 高性能 sql的列转行_行转列_05


想得到如下结果

sql server 行转列 高性能 sql的列转行_数据_06


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

sql server 行转列 高性能 sql的列转行_sql server 行转列 高性能_07


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

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

sql server 行转列 高性能 sql的列转行_行转列_08


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

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

sql server 行转列 高性能 sql的列转行_sql server 行转列 高性能_09


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

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

sql server 行转列 高性能 sql的列转行_行转列_10


这样就跟需求一样。

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

END