一列多行值合并成一个值(MS SQL SERVER 2008)

  1. 描述:将如下形式的数据按id字段合并value字段。  
  2. id    value  
  3. ----- ------  
  4. 1     aa  
  5. 1     bb  
  6. 2     aaa  
  7. 2     bbb  
  8. 2     ccc  
  9. 需要得到结果:  
  10. id     value  
  11. ------ -----------  
  12. 1      aa,bb  
  13. 2      aaa,bbb,ccc  
  14. 即:group by id, 求 value 的和(字符串相加)  
  15. */  
  16. --1、sql2000中只能用自定义的函数解决  
  17. create table tb(id int, value varchar(10))  
  18. insert into tb values(1, 'aa')  
  19. insert into tb values(1, 'bb')  
  20. insert into tb values(2, 'aaa')  
  21. insert into tb values(2, 'bbb')  
  22. insert into tb values(2, 'ccc')  
  23. go  
  24.   
  25. create function dbo.f_str(@id varchar(10)) returns varchar(1000)  
  26. as  
  27. begin  
  28.   declare @str varchar(1000)  
  29.   select @str = isnull(@str + ',' , '') + cast(value as varcharfrom tb where id = @id  
  30.   return @str  
  31. end  
  32. go  
  33.   
  34. --调用函数  
  35. select id , value = dbo.f_str(id) from tb group by id  
  36.   
  37. drop function dbo.f_str  
  38. drop table tb  
  39.   
  40.   
  41. --2、sql2005中的方法  
  42. create table tb(id int, value varchar(10))  
  43. insert into tb values(1, 'aa')  
  44. insert into tb values(1, 'bb')  
  45. insert into tb values(2, 'aaa')  
  46. insert into tb values(2, 'bbb')  
  47. insert into tb values(2, 'ccc')  
  48. go  
  49.   
  50. select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')  
  51. from tb  
  52. group by id  
  53.   
  54. drop table tb  
  55.   
  56.   
  57. --3、使用游标合并数据  
  58. create table tb(id int, value varchar(10))  
  59. insert into tb values(1, 'aa')  
  60. insert into tb values(1, 'bb')  
  61. insert into tb values(2, 'aaa')  
  62. insert into tb values(2, 'bbb')  
  63. insert into tb values(2, 'ccc')  
  64. go  
  65. declare @t table(id int,value varchar(100))--定义结果集表变量  
  66. --定义游标并进行合并处理  
  67. declare my_cursor cursor local for  
  68. select id , value from tb  
  69. declare @id_old int , @id int , @value varchar(10) , @s varchar(100)  
  70. open my_cursor  
  71. fetch my_cursor into @id , @value  
  72. select @id_old = @id , @s=''  
  73. while @@FETCH_STATUS = 0  
  74. begin  
  75.     if @id = @id_old  
  76.        select @s = @s + ',' + cast(@value as varchar)  
  77.     else  
  78.       begin  
  79.         insert @t values(@id_old , stuff(@s,1,1,''))  
  80.         select @s = ',' + cast(@value as varchar) , @id_old = @id  
  81.       end  
  82.     fetch my_cursor into @id , @value  
  83. END  
  84. insert @t values(@id_old , stuff(@s,1,1,''))  
  85. close my_cursor  
  86. deallocate my_cursor  
  87.   
  88. select * from @t  
  89. drop table tb 

你可能感兴趣的:(sql,server,合并)