SQL Server將一列的多行內容拼接成一行

2022-03-30 05:00:59 字數 3229 閱讀 2540

昨天遇到乙個sql server的問題:需要寫乙個儲存過程來處理幾個表中的資料,最後問題出在我想將乙個表的乙個列的多行內容拼接成一行

比如表中有兩列資料 :

ep_classes  ep_name

aaa         企業1

aaa         企業2

aaa         企業3

bbb         企業4

bbb         企業5

我想把這個表變成如下格式:

ep_classes      ep_name

aaa             企業1,企業2,企業3

bbb             企業4,企業5

原先的表名為:ep_detail。

實現**如下:

select ep_classes, ep_name = (stuff((select 『,』 + ep_name from ep_detail where ep_classes =a.ep_classes 

for xml path(」)),1,1,」)) from ep_detail a group by ep_classes

這裡使用了sql server 2005版本以後加入的stuff以及for xml path,先說下在上面這句sql中的作用,然後再詳細的說明一下這兩個的用法。

for xml path(」)
這句是把得到的內容以xml的形式顯示。

stuff((select 『,』 + ep_name from ep_detail where ep_classes = a.ep_classes for xml path(」)),1,1,」)
這句是把拼接的內容的第乙個「,」去掉

好了,現在開始具體說一下用法:

①stuff:

1、作用

stuff(param1, startindex, length, param2)

將param1中自startindex(sql中都是從1開始,而非0)起,刪除length個字元,然後用param2替換刪掉的字元。

2、引數

param1

乙個字元資料表示式。param1可以是常量、變數,也可以是字元列或二進位制資料列。

startindex

乙個整數值,指定刪除和插入的開始位置。如果 startindex或 length 為負,則返回空字串。如果startindex比param1長,則返回空字串。startindex可以是

bigint 型別。

length

乙個整數,指定要刪除的字元數。如果 length 比param1長,則最多刪除到param1

中的最後乙個字元。length 可以是 bigint 型別。

3、返回型別

如果param1是受支援的字元資料型別,則返回字元資料。如果param1是乙個受支援的

binary 資料型別,則返回二進位制資料。

4、備註

如果結果值大於返回型別支援的最大值,則產生錯誤。

eg:

select stuff(『abcdefg』,1,0,『1234

』) –結果為』1234abcdefg』

select stuff(『abcdefg』,1,1,『1234

』) –結果為』1234bcdefg』

select stuff(『abcdefg』,2,1,『1234

』) –結果為』a1234cdefg』

select stuff(『abcdefg』,2,2,『1234』) –結果為』a1234defg』

通過以上4個小例子,應該能明白stuff的用法了。

②for xml path:

for xml path有的人可能知道有的人可能不知道,其實它就是將查詢結果集以xml形式展現,有了它我們可以簡化我們的查詢語句實現一些以前可能需要借助函式活儲存過程來完成的工作。那麼以乙個例項為主.

我們還是通過列子引入:

假設有個表存放著學生的選課情況(stu_courses):

接下來我們來看應用for xml path的查詢結果語句如下:

select stu_name,stu_course from stu_courses for xml path;
結果如下:

張三  

數學

張三

語文

張三

英語

李四

數學

李四

語文

由此可以看出 for xml path 可以將查詢結果根據行輸出成xml各式!而且我們還可以改變xml行節點的名稱,**如下:

select stu_name,stu_course from stu_courses for xml path(『course』);
看顯示結果,原來的行節點變成了我們在path後面括號()中自定義的名稱:

張三  

數學

張三

語文

張三

英語

李四

數學

李四

語文

其實我們還可以改變列節點,還記的給列起別名的關鍵字as嗎?就是用它!**如下:

select stu_name as myname,stu_course as mycourse from stu_courses for xml path(『course』);

張三

數學

張三語文

張三英語

李四數學

李四語文

我們還可以構建我們喜歡的輸出方式,看**:

select 『[『+stu_name+『,』+stu_course+『]』 from stu_courses for xml path(」);
顯示結果:

[張三,數學][張三,語文][張三,英語][李四,數學][李四,語文]
好了,通過上面的說明,估計大家就可以明白開始問題中的sql語句了!

當然,關於開始的問題還有其他的解決辦法,比如:游標、自定義函式等等,那些以後再做補充吧。

以上僅作拋磚引玉之用,如果有問題或者其他的簡便方法,希望提出大家共同討論學習!

SQL Server將一列的多行內容拼接成一行

昨天遇到乙個sql server的問題 需要寫乙個儲存過程來處理幾個表中的資料,最後問題出在我想將乙個表的乙個列的多行內容拼接成一行,比如表中有兩列資料 類別名稱 aaa企業1 aaa企業2 aaa企業3 bbb企業4 bbb企業5 我想把這個表變成如下格式 類別名稱 aaa企業1,企業2,企業3 ...

SQL Server將一列的多行內容拼接成一行

比如表中有兩列資料 ep classes ep name aaa 企業1 aaa 企業2 aaa 企業3 bbb 企業4 bbb 企業5 我想把這個表變成如下格式 ep classes ep name aaa 企業1,企業2,企業3 bbb 企業4,企業5 一開始挺頭疼的 會了的肯定沒有這種感覺,不...

SQL SERVER 字元合併多行為一列

字元合併多行為一列 思路1 行轉列,在與字元拼接 適用每組列數名相同 思路2 轉xml,去掉多餘字元 適用所有 假設興趣表hobbys name hobby 小張打籃球 小張踢足球 name hobby 小張打籃球,踢足球 思路1 注意 此方法只是用分組裡行數內容固定的情況,如學科 語文,英語,數學...