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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM