SQL SERVER將多行資料合併成一行

2022-07-07 07:24:12 字數 2898 閱讀 6013

sql server的問題: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('')
這句是把拼接的內容的第乙個「,」去掉。

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

①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('');
顯示結果

[張三,數學][張三,語文][張三,英語][李四,數學][李四,語文]

SparkDataFrame 將多行資料平鋪展開

場景如下,某個user id在不用的月份在id1 id 12上都有資料,機器學習訓練時,這些id對應不同月份上的資料要麼在一起進行編碼,最終成為一行資料,要麼把這些id對應不同月份的資料展開,成為新的feature,比如id1在201805上的資料可以作為乙個新的feature 201805 id1...

insert into插入多行資料

如何用insert into語句插入多行資料?這是今天一朋友的問題,解決辦法如下 只限於ms sql和my sql資料庫中,其它資料庫沒有測試 下面以例項來說明這個問題 建立乙個使用者表,包括姓名和年齡 create table tablename name varchar 20 primary k...

Oracle多行資料合併

1.多個未知數值合併 selectoperate id,max substr phone id,2 phone id from select operate id,sys connect by path phone id,phone id from select operate id,phone i...