1. 程式人生 > >SQL Server將一列的多行內容拼接成一行或一個字串的問題

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。

    實現程式碼如下:

  1. select ep_classes, ep_name = (stuff((select',' + ep_name from ep_detail where ep_classes =   
  2.     a.ep_classes for xml path('')),1,1,'')) from ep_detail a groupby ep_classes  

    這裡使用了SQL Server 2005版本以後加入的stuff以及for xml path,先說下在上面這句sql中的作用,然後再詳細的說明一下這兩個的用法。
  1. for xml path('')  
這句是把得到的內容以XML的形式顯示。
  1. 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:

  1. select STUFF('abcdefg',1,0,'1234')       --結果為'1234abcdefg'
  2. select STUFF('abcdefg',1,1,'1234')       --結果為'1234bcdefg'
  3. select STUFF('abcdefg',2,1,'1234')       --結果為'a1234cdefg'
  4. select STUFF('abcdefg',2,2,'1234')       --結果為'a1234defg'

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

②for xml path:

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

    我們還是通過列子引入:

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

           

    接下來我們來看應用FOR XML PATH的查詢結果語句如下:

  1. select stu_name,stu_course from stu_courses for xml path;  
    結果如下:
  1. <row>
  2.   <stu_name>張三</stu_name>
  3.   <stu_course>數學</stu_course>
  4. </row>
  5. <row>
  6.   <stu_name>張三</stu_name>
  7.   <stu_course>語文</stu_course>
  8. </row>
  9. <row>
  10.   <stu_name>張三</stu_name>
  11.   <stu_course>英語</stu_course>
  12. </row>
  13. <row>
  14.   <stu_name>李四</stu_name>
  15.   <stu_course>數學</stu_course>
  16. </row>
  17. <row>
  18.   <stu_name>李四</stu_name>
  19.   <stu_course>語文</stu_course>
  20. </row>
    由此可以看出 FOR XML PATH 可以將查詢結果根據行輸出成XML各式!而且我們還可以改變XML行節點的名稱,程式碼如下:
  1. select stu_name,stu_course from stu_courses for xml path('course');  
    看顯示結果,原來的行節點<row> 變成了我們在PATH後面括號()中自定義的名稱<course>:
  1. <course>
  2.   <stu_name>張三</stu_name>
  3.   <stu_course>數學</stu_course>
  4. </course>
  5. <course>
  6.   <stu_name>張三</stu_name>
  7.   <stu_course>語文</stu_course>
  8. </course>
  9. <course>
  10.   <stu_name>張三</stu_name>
  11.   <stu_course>英語</stu_course>
  12. </course>
  13. <course>
  14.   <stu_name>李四</stu_name>
  15.   <stu_course>數學</stu_course>
  16. </course>
  17. <course>
  18.   <stu_name>李四</stu_name>
  19.   <stu_course>語文</stu_course>
  20. </course>

    其實我們還可以改變列節點,還記的給列起別名的關鍵字AS嗎?就是用它!程式碼如下:
  1. select stu_name as MyName,stu_course as MyCourse from stu_courses for xml path('course');  
    顯示結果:
  1. <course>
  2.   <MyName>張三</MyName>
  3.   <MyCourse>數學</MyCourse>
  4. </course>
  5. <course>
  6.   <MyName>張三</MyName>
  7.   <MyCourse>語文</MyCourse>
  8. </course>
  9. <course>
  10.   <MyName>張三</MyName>
  11.   <MyCourse>英語</MyCourse>
  12. </course>
  13. <course>
  14.   <MyName>李四</MyName>
  15.   <MyCourse>

    相關推薦

    SQL Server內容拼接一行一個字串的問題

    昨天遇到一個SQL Server的問題:需要寫一個儲存過程來處理幾個表中的資料,最後問題出在我想將一個表的一個列的多行內容拼接成一行 比如表中有兩列資料 : ep_classes  ep_name AAA         企業1 AAA         企業2

    關於SQL Server內容拼接一行的問題討論

    示例 昨天遇到一個SQL Server的問題:需要寫一個儲存過程來處理幾個表中的資料,最後問題出在我想將一個表的一個列的多行內容拼接成一行,比如表中有兩列資料 : 類別 名稱 AAA 企業1

    關於SQL Server內容拼接一行

    示例 需要寫一個儲存過程來處理幾個表中的資料,最後問題出在我想將一個表的一個列的多行內容拼接成一行,比如表中有兩列資料 : 類別 名稱 AAA 企業1 AAA 企業2 AAA 企業3 BBB 企業4 BBB 企業5 我想把這個表變成如下格式:

    SQL資料合併

    SQL2005以上 用到兩個方法 stuff 和 for xml path stuff : stuff(param1, startIndex, length, param2) 說明:將param1中自startIndex(SQL中都是從1開始,而非0)起,刪除length

    sql 同一內容拼接字串

    SELECT L4.plan_id ,MAX(SUBSTR(L4.分組內容,2)) display_theme FROM( SELECT L3.plan_id

    MSSQL資料拼接

    select e_uid, base_no = (stuff((select ';' + base_no from e_baseuid where e_uid = a.e_uid for xml path('')),1,1,'')), e_usetype = (stuff((

    SQLOracle中同一記錄拼接一個字串

    -- 原始資料 -- a 111 -- b 222 -- a 333 -- a 444 -- b 555 -- 最終結果 -- a 111*333*444 SELECT L4.L_TIME ,MAX(SUBSTR(L4.分組內容,2)) 最終欄位

    Sql-Server用insert插入數據-語法和例子

    語法 strong -- into div lec sele 多條 sql 插入多行數據,原表中有多條數據,再建新表很麻煩,就要用到以下語法: 通過Insert select 語句將現有的表的數據添加到已存在的表中語法:Insert into<新的表名>(列名)

    SQL SERVER 個數據庫中的表和資料複製到另個數據庫中

    第一種情況:將A資料庫.dbo.A表的資料追加到B資料庫.dbo.B表中 (條件:此時B資料庫中已建立好了B表) insert into B資料庫.dbo.B表 select * from A資料庫.dbo.A表 [where條件] 此T-SQL語句會有異常   &n

    SQL SERVER 字元拆分列為

    注:先學習sql server裡的遞迴CTE。 假設有興趣表Hobbys Name Hobby 小張 籃球,足球,羽毛球       Name Hobby

    資料庫一行

    如題: select max(case when name='1' then [temp] else null end) as temp1 , max(case when name='2' t

    SQL Server中將資料拼接一行資料(一個字串

    SELECT @Users = @Users + ‘,’ + UserName FROM dbo.[User] WHERE RoleID = 1 SELECT @Users 方法二:使用for xml path(”) 和stuff –使用 自連線、f

    199. mysql 資料用逗號連線返回一個字串

    1.需求 我們有時候會將多行資料進行合併顯示(Java 使用迴圈處理 有點麻煩  現在直接在sql中處理) 2.效果 3. 表結構 及sql 查詢 使用者角色中間表 角色表 表關係 --3. 我們需要 分組查詢  使用GROUP_CONCAT 函式

    [Hive]用concat_w實現記錄合併一行

    建表如下: # 建立商品與促銷活動的對映表 hive -e "set mapred.job.queue.name=pms; set hive.exec.reducers.max=32; set ma

    LINUX下把檔案合併一行,並組裝SQL

       先說一下適用的場景,市場部那邊希望看到某些商品中“黃牛”使用者的活動情況,以及“黃牛”使用代金券的情況,然後發一個excel檔案過來,拿到檔案先複製到notepad++中,格式類似: idname price 1name1 price1 2name2 price2 3

    oracle 聚合函式 LISTAGG ,結果合併一行

    LISTAGG(列名,' 分割符號') oracle 11g 以上的版本才有的一個將指定列名的多行查詢結果,用 指定的分割符號 合併成一行顯示: 例如: 表原始資料: 需求:將 mb1_Transport_License_list 表中的資料,根據 transport

    sql-server 查出同一的不同值轉變一行不同

    現在有個業務需要,查出一個表的同列不同值的轉換成同一行不同欄位, 如下 user_task 表: id user_nanm task_type 1 張三 1

    Oracle 連接一行 convert multiple rows to one row

    acl art rom 用法 port trac 我的電腦 現在 row animal id name 1 dog 1 cat 2 lion 怎麽得到相同id的name list呢?也就是想得到id 為1的list為dog, cat格式。 1. 首先Or

    資料合併一行

    需求:在大資料平臺maxcompute上統計各個等級對應的人數,欄位大致如下 CREATE TABLE `XXXX` ( `requestid` char(32) DEFAULT NULL, `id` char(32) NOT NULL, `createtime` varchar

    Oracle 資料合併一行

    方案一:wm_concat函式 select username, id, wmsys.wm_concat(subject) as subject, wmsys.wm_concat(score) a