sql server 使用for xml path 將1列多行轉換為字串串連起來

來源:互聯網
上載者:User
Sql代碼  
  1. create table tb ([id] int,[name] varchar(2))  
  2. insert into tb  
  3. select 1,'aa' union all  
  4. select 2,'bb' union all  
  5. select 1,'cc' union all  
  6. select 3,'dd' union all  
  7. select 2,'ee'  
  8.    
  9. select * from tb  
  10. --查詢  
  11. select   
  12.   id,  
  13.   name=stuff((select ','+name from tb where id=t.id for xml path('')),1,1,'')  
  14. from  
  15.   tb t  
  16. group by  
  17.   id  
  18.    
  19.    
  20.    
  21. 方法二:  
  22.    
  23. CREATE FUNCTION GET_STRING(@ID INT)  
  24. RETURNS VARCHAR(50)  
  25. AS   
  26.   BEGIN   
  27.        DECLARE @NAME VARCHAR(500)  
  28.        SELECT @NAME=ISNULL(@NAME+',','')+NAME FROM TB WHERE ID=@ID  
  29.        RETURN @NAME  
  30.   END  
  31.   
  32.   
  33. SELECT ID ,DBO.GET_STRING(ID)NAME FROM TB GROUP BY ID  
  34.   
  35. -----------------------------------------------------------------------  
  36. 在oracle中,是有相對應的函數,sys_connect_by_path函數。  
  37.   
  38. 先在這裡把oracle的函數實現也寫下吧  
  39.   
  40. select id  
  41.       ,itrim(max(sys_connect_by_path(name,','))) as name  
  42. from   
  43.     (select id  
  44.     ,name  
  45.     ,lead(rnFirst) over(partition by no order by rnFirst)rnNext  
  46.      from   
  47.   (select a.id  
  48.   ,a.name  
  49.   ,row_number() over(order by a.id,a.name desc) rnFirst  
  50.    from @t a) tmpTable1  
  51. ) tmpTable2  
  52. start with rnNext is null  
  53. connect by rnNext = PRior rnFirst  
  54. group by id  
  55.   
  56. 以上是實現oracle中的行轉列方式。  
  57.   
  58. ********************************************下面我們來看一下sqlserver的,因為sqlserver沒提供類似的函數,不知道sqlserver2012提供沒  
  59.   
  60. 不過sqlserver支援起來也很簡單,使用cross apply和for xml path組合來用,這兩個單獨都知道是怎麼回事,怎麼使用,但是真不知道還有它倆組合來完成這個功能的,感到很是不可思議,這裡要感謝下網路上的人,原來自己寫東西都是把所學到的知識記錄到本機,從不放到網上,也可能是最近吧,好多工作不會,都是通過網路協助,就把我所知道的東西也都放到網上來,大家一起學習。  
  61.   
  62. sqlserver:  
  63.   
  64. select id, SUBSTRING(names, 1, len(names)-1) from @t AS A cross APPLY  
  65. (SELECT NAME + ',' FROM @t AS B WHERE A.id = B.id FOR XML PATH('')) D (names)  
  66.   
  67. GROUP BY id, names  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.