SQL Server 将两行或者多行拼接成一行数据

一个朋友,碰到一个问题。

就是查询出来的结果集,需要每隔三行。就将这三行数据以此拼接为一行显示。起初我想着用ROW_NUMBER加CASE WHEN去做,发现结果并非我预期那样。

结果如下:

 

 由于别人的数据,不方便显示。查询出来还是为三行数据,只是将其余部分展现出了空值。这种结果是不行的。

随后百度找到了,下面内容的百度经验。本想用这个数据集,以及语句贴上来。但还是因为不方便,就将那篇百度经验拿过来使用吧!

下面的百度经验是针对于两行数据进行的操作,多行数据也可以操作。

 

 这里的左连接条件只需要写,下一行行数减一等于当前行数即可。以此类推

例:

FROM #tmpTest t1
LEFT JOIN #tmpTest t2 ON t1.RowNum = t2.RowNum - 1
LEFT JOIN #tmpTest t3 ON t2.RowNum = t3.RowNum - 1

这样数据依然会是三行,但他会将第二行的数据在第一行的数据后进行拼接,将第三行的数据在第二行后进行拼接。

假设你有三条数据,那么最终只需在查询结果中。针对于ROW_NUMBER排序后的行数进行取模拿到第一行便可得到你想要的数据。

RowNum % 3 = 1

有几行,便模于几。

 

以下便是百度经验内容:

SQL Server:按照数据库ROW_NUMBER()产生的行号,将相邻奇数行与偶数行拼接成一行。

思路:使用表 左自连接。

 

 

 模拟数据源表结构,使用临时表

 

 

 插入模拟数据

 

 

 模拟按照Code栏位排序后生成 ROW_NUMBER() 行号

 

 

 将两行数据合并成一行,奇数行号在左侧,偶数行号在右侧

 

 

 模拟效果如下图所示

 

 

 

 

 

 

完整的模拟过程SQL如下:

 -- 模拟数据源表结构

   create table #test(

    Code varchar(50),

    Remark varchar(200)

   )

   

   -- 模拟数据

   insert into #test(Code, Remark) values('A', 'A Remark');

   insert into #test(Code, Remark) values('B', 'B Remark');

   insert into #test(Code, Remark) values('C', 'C Remark');

   insert into #test(Code, Remark) values('D', 'D Remark');

   

   -- 模拟按照Code栏位排序后生成行号

   select  ROW_NUMBER() over(order by Code) as RowNum, Code

             ,Remark

   into #tmpTest

   from #test

   order by Code

   

   -- 将两行数据合并成一行,奇数行号在左侧,偶数行号在右侧

   select test1.RowNum

             ,test1.Code

             ,test1.Remark

             ,test2.RowNum as RowNum2

             ,test2.Code AS Code2 

             ,test2.Remark AS Remark2

   from #tmpTest test1

   left join #tmpTest test2 on test1.RowNum = test2.RowNum -1 

                                        and test2.RowNum % 2 = 0

   where test1.RowNum % 2 =1

 

posted @ 2020-09-11 15:32  Sir奔  阅读(5538)  评论(0编辑  收藏  举报