SQL SERVER使用STUFF函數拼接記錄爲逗號分隔符

SQL SERVER使用STUFF函數拼接記錄爲逗號分隔符


SQL STUFF函數 拼接字符串  面試

   

 

     今日看到一篇文章,是關於和並列的,也研究了下,仍是不錯的sql

 

 


要這種效果。數據庫

 

create table tb(idint, value varchar(10))網絡

insert into tbvalues(1,'aa')ide

insert into tbvalues(1,'bb')函數

insert into tbvalues(2,'aaa')學習

insert into tbvalues(2,'bbb')fetch

insert into tbvalues(2,'ccc')spa

go.net

 

/*         stuff(param1, startIndex, length, param2)
說明:將param1中自startIndex(SQL中都是從1開始,而非0)起,刪除length個字符,而後用param2替換刪掉的字符。*/

SELECT id, 
                      value = stuff
                          ((SELECT     ',' + value
                              FROM         tb AS t
                              WHERE     t .id = tb.id FOR xml path('')), 1, 1, '')
FROM         tb
GROUP BY id

 

這樣便可。

 

 

例如 兩個表  汽車分組表tb_group,和汽車表tb_car

 select id, groupname, contace, mobile, begintime, endtime, parkingcount, groupType
,value = stuff((SELECT  ',' + plate FROM  tb_car AS t WHERE  t .groupid = [tb_group].id FOR xml path('')), 1, 1, '')
 from [dbo].[tb_group]

 

結果爲

===================================================================================

收集的資料

[sql] view plaincopyprint?      

  1. /*  
  2. 標題:按某字段合併字符串之一(簡單合併)  
  3. 做者:(十八年風雨,守得冰山雪蓮花開)  
  4. 時間:2008-11-06  
  5. 地點:廣東深圳  
  6.   
  7. 描述:將以下形式的數據按id字段合併value字段。  
  8. id    value  
  9. ----- ------   
  10. 1     aa  
  11. 1     bb  
  12. 2     aaa  
  13. 2     bbb  
  14. 2     ccc  
  15. 須要獲得結果:  
  16. id     value  
  17. ------ -----------   
  18. 1      aa,bb  
  19. 2      aaa,bbb,ccc  
  20. 即:group by id, 求 value 的和(字符串相加)  
  21. */  
  22. --一、sql2000中只能用自定義的函數解決   
  23. create table tb(id int, value varchar(10))  
  24. insert into tb values(1, 'aa')  
  25. insert into tb values(1, 'bb')  
  26. insert into tb values(2, 'aaa')  
  27. insert into tb values(2, 'bbb')  
  28. insert into tb values(2, 'ccc')  
  29. go  
  30.   
  31. create function dbo.f_str(@id varchar(10)) returns varchar(1000)  
  32. as  
  33. begin  
  34.   declare @str varchar(1000)  
  35.   select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id  
  36.   return @str  
  37. end  
  38. go  
  39.   
  40. --調用函數   
  41. select id , value = dbo.f_str(id) from tb group by id  
  42.   
  43. drop function dbo.f_str  
  44. drop table tb  
  45.   
  46.   
  47. --二、sql2005中的方法   
  48. create table tb(id int, value varchar(10))  
  49. insert into tb values(1, 'aa')  
  50. insert into tb values(1, 'bb')  
  51. insert into tb values(2, 'aaa')  
  52. insert into tb values(2, 'bbb')  
  53. insert into tb values(2, 'ccc')  
  54. go  
  55.   
  56. select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')  
  57. from tb  
  58. group by id  
  59.   
  60. drop table tb  
  61.   
  62.   
  63. --三、使用遊標合併數據   
  64. create table tb(id int, value varchar(10))  
  65. insert into tb values(1, 'aa')  
  66. insert into tb values(1, 'bb')  
  67. insert into tb values(2, 'aaa')  
  68. insert into tb values(2, 'bbb')  
  69. insert into tb values(2, 'ccc')  
  70. go  
  71. declare @t table(id int,value varchar(100))--定義結果集表變量   
  72. --定義遊標並進行合併處理   
  73. declare my_cursor cursor local for  
  74. select id , value from tb  
  75. declare @id_old int , @id int , @value varchar(10) , @s varchar(100)  
  76. open my_cursor  
  77. fetch my_cursor into @id , @value  
  78. select @id_old = @id , @s=''  
  79. while @@FETCH_STATUS = 0  
  80. begin  
  81.     if @id = @id_old  
  82.        select @s = @s + ',' + cast(@value as varchar)  
  83.     else  
  84.       begin  
  85.         insert @t values(@id_old , stuff(@s,1,1,''))  
  86.         select @s = ',' + cast(@value as varchar) , @id_old = @id  
  87.       end  
  88.     fetch my_cursor into @id , @value  
  89. END  
  90. insert @t values(@id_old , stuff(@s,1,1,''))  
  91. close my_cursor  
  92. deallocate my_cursor  
  93.   
  94. select * from @t  
  95. drop table tb  


 



 

小麥苗課程

小麥苗課堂開課啦,以下是現有的課程,歡迎諮詢小麥苗:


課程名稱

課時

上課時間

價格

OCP(從入門到專家)

每一年1期,35課時左右/期

20:00-22:00

1588(可優惠)

OCM認證

每一年N期,9課時/期

20:00-22:00

22888

高可用課程(rac+dg+ogg)

每一年1期,20課時左右/期

20:00-22:00

1888(可優惠)

Oracle初級入門

每一年1期,15課時左右/期

20:00-22:00

800

Oracle健康檢查腳本

可weixin或微店購買。

88

Oracle數據庫技能直通車

包含以下3個課程:

①《11g OCP網絡課程培訓》(面向零基礎) 價值1600元

②《11g OCM網絡班課程培訓》(Oracle技能合集)價值10000+元

③《RAC + DG + OGG 高可用網絡班課程》 價值2000元

以上3個課程所有打包只要5888,只要5888全部課程帶回家,終身指導!全部課程都是在線講課,不是播放視頻,課件所有贈送!

注意:以上OCP和OCM課程只包括培訓課程,不包括考試費用。OCM提供培訓+視頻,可是不提供練習環境和資料。報名一次,OCP和高可用的課程能夠免費終身循環聽課。

5888

OCP+高可用(rac+dg+ogg)

報名OCP+高可用課程,能夠優惠300元,優惠後的價格爲3188.

3188(可優惠)

注意:

一、每次上課前30分鐘答疑。

二、OCM實時答疑,提供和考試同樣的練習模擬環境,只要按照老師講的方式來練習,能夠保證100%經過。

三、授課方式:YY語音網絡直播講課(非視頻) + QQ互動答疑 + 視頻複習。

四、OCP課時能夠根據你們學習狀況進行增長或縮減。

五、以上全部課程都可循環聽課。

六、12c OCM課程私聊。

七、Oracle初級入門課程,只教你們最實用+最經常使用的Oracle操做維護知識。

八、以上全部課程,能夠加小麥苗weixin(lhrbestxh)或QQ(646634621)詳聊,優惠多多。


培訓項目

鏈接地址

DB筆試面試歷史鏈接

http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w

OCP培訓說明鏈接

https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

OCM培訓說明鏈接

https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

高可用(RAC+DG+OGG)培訓說明鏈接

https://mp.weixin.qq.com/s/4vf042CnOdAD8zDyjUueiw

OCP最新題庫解析歷史鏈接(052)

http://mp.weixin.qq.com/s/bUgn4-uciSndji_pUbLZfA

微店地址

https://weidian.com/s/793741433?wfr=c&ifr=shopdetail





About Me

.............................................................................................................................................

● 本文做者:小麥苗,部份內容整理自網絡,如有侵權請聯繫小麥苗刪除

● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客園(http://www.cnblogs.com/lhrbest)和我的weixin公衆號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文博客園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版、我的簡介及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 數據庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

.............................................................................................................................................

● QQ羣號:230161599(滿)、618766405

● weixin羣:可加我weixin,我拉你們進羣,非誠勿擾

● 聯繫我請加QQ好友(646634621),註明添加原因

● 於 2018-07-01 06:00 ~ 2018-07-31 24:00 在魔都完成

● 最新修改時間:2018-07-01 06:00 ~ 2018-07-31 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網絡,如有侵權或不當之處還請諒解

● 版權全部,歡迎分享本文,轉載請保留出處

.............................................................................................................................................

● 小麥苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

● 小麥苗出版的數據庫類叢書:http://blog.itpub.net/26736162/viewspace-2142121/

● 小麥苗OCP、OCM、高可用網絡班:http://blog.itpub.net/26736162/viewspace-2148098/

.............................................................................................................................................

使用weixin客戶端掃描下面的二維碼來關注小麥苗的weixin公衆號(xiaomaimiaolhr)及QQ羣(DBA寶典)、添加小麥苗weixin,學習最實用的數據庫技術。

小麥苗的weixin公衆號小麥苗的DBA寶典QQ羣2小麥苗的weixin二維碼小麥苗的微店

   小麥苗的weixin公衆號      小麥苗的DBA寶典QQ羣2       小麥苗的weixin二維碼          小麥苗的微店

.............................................................................................................................................


ico_mailme_02.png
歡迎與我聯繫






來自 「 ITPUB博客 」 ,連接:http://blog.itpub.net/26736162/viewspace-2157302/,如需轉載,請註明出處,不然將追究法律責任。

     今日看到一篇文章,是關於和並列的,也研究了下,仍是不錯的

 

 


要這種效果。

 

create table tb(idint, value varchar(10))

insert into tbvalues(1,'aa')

insert into tbvalues(1,'bb')

insert into tbvalues(2,'aaa')

insert into tbvalues(2,'bbb')

insert into tbvalues(2,'ccc')

go

 

/*         stuff(param1, startIndex, length, param2)
說明:將param1中自startIndex(SQL中都是從1開始,而非0)起,刪除length個字符,而後用param2替換刪掉的字符。*/

SELECT id, 
                      value = stuff
                          ((SELECT     ',' + value
                              FROM         tb AS t
                              WHERE     t .id = tb.id FOR xml path('')), 1, 1, '')
FROM         tb
GROUP BY id

 

這樣便可。

 

 

例如 兩個表  汽車分組表tb_group,和汽車表tb_car

 select id, groupname, contace, mobile, begintime, endtime, parkingcount, groupType
,value = stuff((SELECT  ',' + plate FROM  tb_car AS t WHERE  t .groupid = [tb_group].id FOR xml path('')), 1, 1, '')
 from [dbo].[tb_group]

 

結果爲

===================================================================================

收集的資料

[sql] view plaincopyprint?      

  1. /*  
  2. 標題:按某字段合併字符串之一(簡單合併)  
  3. 做者:(十八年風雨,守得冰山雪蓮花開)  
  4. 時間:2008-11-06  
  5. 地點:廣東深圳  
  6.   
  7. 描述:將以下形式的數據按id字段合併value字段。  
  8. id    value  
  9. ----- ------   
  10. 1     aa  
  11. 1     bb  
  12. 2     aaa  
  13. 2     bbb  
  14. 2     ccc  
  15. 須要獲得結果:  
  16. id     value  
  17. ------ -----------   
  18. 1      aa,bb  
  19. 2      aaa,bbb,ccc  
  20. 即:group by id, 求 value 的和(字符串相加)  
  21. */  
  22. --一、sql2000中只能用自定義的函數解決   
  23. create table tb(id int, value varchar(10))  
  24. insert into tb values(1, 'aa')  
  25. insert into tb values(1, 'bb')  
  26. insert into tb values(2, 'aaa')  
  27. insert into tb values(2, 'bbb')  
  28. insert into tb values(2, 'ccc')  
  29. go  
  30.   
  31. create function dbo.f_str(@id varchar(10)) returns varchar(1000)  
  32. as  
  33. begin  
  34.   declare @str varchar(1000)  
  35.   select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id  
  36.   return @str  
  37. end  
  38. go  
  39.   
  40. --調用函數   
  41. select id , value = dbo.f_str(id) from tb group by id  
  42.   
  43. drop function dbo.f_str  
  44. drop table tb  
  45.   
  46.   
  47. --二、sql2005中的方法   
  48. create table tb(id int, value varchar(10))  
  49. insert into tb values(1, 'aa')  
  50. insert into tb values(1, 'bb')  
  51. insert into tb values(2, 'aaa')  
  52. insert into tb values(2, 'bbb')  
  53. insert into tb values(2, 'ccc')  
  54. go  
  55.   
  56. select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')  
  57. from tb  
  58. group by id  
  59.   
  60. drop table tb  
  61.   
  62.   
  63. --三、使用遊標合併數據   
  64. create table tb(id int, value varchar(10))  
  65. insert into tb values(1, 'aa')  
  66. insert into tb values(1, 'bb')  
  67. insert into tb values(2, 'aaa')  
  68. insert into tb values(2, 'bbb')  
  69. insert into tb values(2, 'ccc')  
  70. go  
  71. declare @t table(id int,value varchar(100))--定義結果集表變量   
  72. --定義遊標並進行合併處理   
  73. declare my_cursor cursor local for  
  74. select id , value from tb  
  75. declare @id_old int , @id int , @value varchar(10) , @s varchar(100)  
  76. open my_cursor  
  77. fetch my_cursor into @id , @value  
  78. select @id_old = @id , @s=''  
  79. while @@FETCH_STATUS = 0  
  80. begin  
  81.     if @id = @id_old  
  82.        select @s = @s + ',' + cast(@value as varchar)  
  83.     else  
  84.       begin  
  85.         insert @t values(@id_old , stuff(@s,1,1,''))  
  86.         select @s = ',' + cast(@value as varchar) , @id_old = @id  
  87.       end  
  88.     fetch my_cursor into @id , @value  
  89. END  
  90. insert @t values(@id_old , stuff(@s,1,1,''))  
  91. close my_cursor  
  92. deallocate my_cursor  
  93.   
  94. select * from @t  
  95. drop table tb  
相關文章
相關標籤/搜索