一个朋友,碰到一个问题。
就是查询出来的结果集,需要每隔三行。就将这三行数据以此拼接为一行显示。起初我想着用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