比如表中有兩列資料 :
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將一列的多行內容拼接成一行
昨天遇到乙個sql server的問題 需要寫乙個儲存過程來處理幾個表中的資料,最後問題出在我想將乙個表的乙個列的多行內容拼接成一行 比如表中有兩列資料 ep classes ep name aaa 企業1 aaa 企業2 aaa 企業3 bbb 企業4 bbb 企業5 我想把這個表變成如下格式 e...
SQL SERVER 字元合併多行為一列
字元合併多行為一列 思路1 行轉列,在與字元拼接 適用每組列數名相同 思路2 轉xml,去掉多餘字元 適用所有 假設興趣表hobbys name hobby 小張打籃球 小張踢足球 name hobby 小張打籃球,踢足球 思路1 注意 此方法只是用分組裡行數內容固定的情況,如學科 語文,英語,數學...