一個朋友,碰到一個問題。
就是查詢出來的結果集,需要每隔三行。就將這三行數據以此拼接為一行顯示。起初我想着用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