1. 程式人生 > >MSSQL將多行資料拼接成一列

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((select ';' + e_usetype from e_baseuid where e_uid = a.e_uid for xml path('')),1,1,'')) from e_baseuid a group by e_uid;

SQL STUFF函式 拼接字串 stuff函式怎麼用 mssql

 我來答

1、作用
刪除指定長度的字元,並在指定的起點處插入另一組字元。
2、語法
STUFF ( character_expression , start , length ,character_expression )
3、示例
以下示例在第一個字串 abcdef 中刪除從第 2 個位置(字元 b)開始的三個字元,然後在刪除的起始位置插入第二個字串,從而建立並返回一個字串
SELECT STUFF('abcdef', 2, 3, 'ijklmn')
GO
下面是結果集
aijklmnef

其次,我們理解stuff函式的用法,通過上述程式碼拼接生成的內容為“;張三;李四;王五”,顯然最前的“;”是多餘的,所以我們通過stuff來去除。

 STUFF(string,insert position,delete count,string inserted)函式是將一個字串插入到另一個字串中。插入時,插入的字串可能刪除指定數量的字元。

 第一個引數string,指的就是你要操作的內容,可以是一個固定字串,也可以指定為某列;

 第二個引數insert position,指插入開始位置,SQLSERVER中預設是從1開始,而非從0開始;

 第三個引數delete count,指的是要刪除的字元個數,從position刪除指定的個數,如果count為0表示不刪除;

 第四個引數string inserted,表示要插入的字串;

    eg:select  stuff('abcdefg',3,2,'123')

 結果:ab123efg

SQLServer For XML Path的運用

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

        一.FOR XML PATH 簡單介紹

那麼還是首先來介紹一下FOR XML PATH ,假設現在有一張興趣愛好表(hobby)用來存放興趣愛好,表結構如下:

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

SELECT * FROM @hobby FOR XML PATH

       結果:

  1. <row>

  2. <hobbyID>1</hobbyID>

  3. <hName>爬山</hName>

  4. </row>

  5. <row>

  6. <hobbyID>2</hobbyID>

  7. <hName>游泳</hName>

  8. </row>

  9. <row>

  10. <hobbyID>3</hobbyID>

  11. <hName>美食</hName>

  12. </row>

      由此可見FOR XML PATH 可以將查詢結果根據行輸出成XML各式!

      那麼,如何改變XML行節點的名稱呢?程式碼如下:     

SELECT * FROM @hobby FOR XML PATH('MyHobby')

      結果一定也可想而知了吧?沒錯原來的行節點<row> 變成了我們在PATH後面括號()中,自定義的名稱<MyHobby>,結果如下:

  1. <MyHobby>

  2. <hobbyID>1</hobbyID>

  3. <hName>爬山</hName>

  4. </MyHobby>

  5. <MyHobby>

  6. <hobbyID>2</hobbyID>

  7. <hName>游泳</hName>

  8. </MyHobby>

  9. <MyHobby>

  10. <hobbyID>3</hobbyID>

  11. <hName>美食</hName>

  12. </MyHobby>

      這個時候細心的朋友一定又會問那麼列節點如何改變呢?還記的給列起別名的關鍵字AS嗎?對了就是用它!程式碼如下:

SELECT hobbyID as 'MyCode',hName as 'MyName' FROM @hobby FOR XML PATH('MyHobby')


      那麼這個時候我們列的節點名稱也會程式設計我們自定義的名稱 <MyCode>與<MyName>結果如下:

  1. <MyHobby>

  2. <MyCode>1</MyCode>

  3. <MyName>爬山</MyName>

  4. </MyHobby>

  5. <MyHobby>

  6. <MyCode>2</MyCode>

  7. <MyName>游泳</MyName>

  8. </MyHobby>

  9. <MyHobby>

  10. <MyCode>3</MyCode>

  11. <MyName>美食</MyName>

  12. </MyHobby>

    噢! 既然行的節點與列的節點我們都可以自定義,我們是否可以構建我們喜歡的輸出方式呢?還是看程式碼: 

SELECT '[ '+hName+' ]' FROM @hobby FOR XML PATH(''

    沒錯我們還可以通過符號+號,來對字串型別欄位的輸出格式進行定義。結果如下:

[ 爬山 ][ 游泳 ][ 美食 ]


    那麼其他型別的列怎麼自定義? 沒關係,我們將它們轉換成字串型別就行啦!例如:

SELECT '{'+STR(hobbyID)+'}','[ '+hName+' ]' FROM @hobby FOR XML PATH('')


    好的 FOR XML PATH就基本介紹到這裡吧,更多關於FOR XML的知識請查閱幫助文件!

    接下來我們來看一個FOR XML PATH的應用場景吧!那麼開始吧。。。。。。

        二.一個應用場景與FOR XML PATH應用

首先呢!我們在增加一張學生表,列分別為(stuID,sName,hobby),stuID代表學生編號,sName代表學生姓名,hobby列存學生的愛好!那麼現在表結構如下:

           

        這時,我們的要求是查詢學生表,顯示所有學生的愛好的結果集,程式碼如下:

  1. SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM (

  2. SELECT sName,

  3. (SELECT hobby+',' FROM student

  4. WHERE sName=A.sName

  5. FOR XML PATH('')) AS StuList

  6. FROM student A

  7. GROUP BY sName

  8. ) B

         結果如下:

 分析: 好的,那麼我們來分析一下,首先看這句:

  1. SELECT hobby+',' FROM student

  2. WHERE sName=A.sName

  3. FOR XML PATH('')


這句是通過FOR XML PATH 將某一姓名如張三的愛好,顯示成格式為:“ 愛好1,愛好2,愛好3,”的格式!

那麼接著看:

  1. SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM (

  2. SELECT sName,

  3. (SELECT hobby+',' FROM student

  4. WHERE sName=A.sName

  5. FOR XML PATH('')) AS StuList

  6. FROM student A

  7. GROUP BY sName

  8. ) B

剩下的程式碼首先是將表分組,在執行FOR XML PATH 格式化,這時當還沒有執行最外層的SELECT時查詢出的結構為:

可以看到StuList列裡面的資料都會多出一個逗號,這時隨外層的語句:stuff(StuList,1,1,'')  就是來去掉逗號,並賦予有意義的列明!

舉例:

連結欄位去掉重複值進行連線(子句中加入group by 即可)

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

相關推薦

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((

postgresql 9.3 自定義聚合函式實現資料合併

前言 常見的一種需求,如下圖(1): 目前需要按右邊的factor_code進行分組,將左邊的behavior_code這一列通過指定分隔符連線起來,比如通過<br /> 來連線,理想的效果應當是如下圖(2)這樣: 下面就來討論一下實現

資料庫中如何條集合拼接條返回

create  function [dbo].[fun_getUpdateInfo](@ImageCode VARCHAR(100))                                           --傳入引數 returns varchar(8000

oracle資料庫把某資料資料

select running_time, running_user, algorithm_id, algorithm_list_id, name1, name2, ROWNUM, wm_concat(t

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

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

sqlserver 一個欄位下的語句合併資料

select 名稱 = ( stuff( (select ',' + CAST(欄位名AS VARCHAR) from 表名 where 條件 for xml path('')), 1, 1,

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

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

關於SQL Server內容拼接一行

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

ORACLE:資料字串

上篇文章寫的是在ibatis中,需要返回一個字串,卻返回了多行資料,結果出現了錯誤。 其實,我想做的是:   查詢表中的一個欄位,返回了多行,就把這麼多行的資料都拼成一個字串。 例:   id  name        1   aa        2   bb       

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

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

資料合併一行

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

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

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

oracle 如何資料進行合併(用LISTAGG!!!)

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

GROUP_CONCAT,SUBSTRING_INDEX的妙用(資料合併一行,並且根據某些的合併值做條件判斷來生成最終值)

(1)不做處理: SELECT e.class_id AS class_id, c.course_name AS class_name, u.stuNum AS stu_num, u.USER_NAME AS student_name, u.department AS depart

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

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

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

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

如何優雅的個數組合併個數組(去重)

思考如何寫一個方法將傳遞過來的多個未知個數的數組合併成一個數組並去除陣列中的重複項? 這裡會用到ES5的concat()方法和apply()方法,基礎的for迴圈方法這裡不進行闡述。 concat(arr1,arr2)方法接受多個數組元素,並將arr2中

Mysql之一對查詢,如何條記錄合併條記錄

資料庫環境:mysql5.6 需求描述(圖1): 最終期望的結果(圖2): 如上圖所示,現有兩張表cj_lottery_winning_record和cj_lottery_winning_user_info 兩者的關係是一對多。 現在進行連線查

php張圖片拼接張圖片

<?php $imgs = array(); $imgs[0] = 'imgs/1.jpg'; $imgs[1] = 'imgs/2.jpg'; $imgs[2] = 'imgs/3.jpg'; $imgs[3] = 'imgs/4.jpg'; $target

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

--使用 自連線、for xml path('')和stuff合併顯示多行資料到一行中 --注 --1、計算列可以不用包含在聚合函式中而直接顯示,如下面語句的val。 --2、for xml path('') 應該應用於語句的最後面,繼而生成xml。 --3、for xml path('root')中的pa