找回密碼
 註冊
搜索
查看: 4977|回復: 1

SQL 行轉列並且合併顯示

[複製鏈接]
發表於 2011-2-16 14:52:13 | 顯示全部樓層 |閱讀模式
  1. /*
  2. 標題:按某字段合併字符串之一(簡單合併)
  3. 作者:愛新覺羅.毓華(十八年風雨,守得冰山雪蓮花開)
  4. 時間:2008-11-06
  5. 地點:廣東深圳

  6. 描述:將如下形式的數據按id字段合併value字段。
  7. id    value
  8. ----- ------
  9. 1     aa
  10. 1     bb
  11. 2     aaa
  12. 2     bbb
  13. 2     ccc
  14. 需要得到結果:
  15. id     value
  16. ------ -----------
  17. 1      aa,bb
  18. 2      aaa,bbb,ccc
  19. 即:group by id, 求 value 的和(字符串相加)
  20. */
  21. --1、sql2000中只能用自定義的函數解決
  22. create table tb(id int, value varchar(10))
  23. insert into tb values(1, 'aa')
  24. insert into tb values(1, 'bb')
  25. insert into tb values(2, 'aaa')
  26. insert into tb values(2, 'bbb')
  27. insert into tb values(2, 'ccc')
  28. go

  29. create function dbo.f_str(@id int) returns varchar(100)
  30. as
  31. begin
  32.     declare @str varchar(1000)
  33.     set @str = ''
  34.     select @str = @str + ',' + cast(value as varchar) from tb where id = @id
  35.     set @str = right(@str , len(@str) - 1)
  36.     return @str
  37. end
  38. go

  39. --調用函數
  40. select id , value = dbo.f_str(id) from tb group by id

  41. drop function dbo.f_str
  42. drop table tb


  43. --2、sql2005中的方法
  44. create table tb(id int, value varchar(10))
  45. insert into tb values(1, 'aa')
  46. insert into tb values(1, 'bb')
  47. insert into tb values(2, 'aaa')
  48. insert into tb values(2, 'bbb')
  49. insert into tb values(2, 'ccc')
  50. go

  51. select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
  52. from tb
  53. group by id

  54. drop table tb


  55. --3、使用游標合併數據
  56. create table tb(id int, value varchar(10))
  57. insert into tb values(1, 'aa')
  58. insert into tb values(1, 'bb')
  59. insert into tb values(2, 'aaa')
  60. insert into tb values(2, 'bbb')
  61. insert into tb values(2, 'ccc')
  62. go
  63. declare @t table(id int,value varchar(100))--定義結果集表變量
  64. --定義游標並進行合併處理
  65. declare my_cursor cursor local for
  66. select id , value from tb
  67. declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
  68. open my_cursor
  69. fetch my_cursor into @id , @value
  70. select @id_old = @id , @s=''
  71. while @@FETCH_STATUS = 0
  72. begin
  73.     if @id = @id_old
  74.        select @s = @s + ',' + cast(@value as varchar)
  75.     else
  76.       begin
  77.         insert @t values(@id_old , stuff(@s,1,1,''))
  78.         select @s = ',' + cast(@value as varchar) , @id_old = @id
  79.       end
  80.     fetch my_cursor into @id , @value
  81. END
  82. insert @t values(@id_old , stuff(@s,1,1,''))
  83. close my_cursor
  84. deallocate my_cursor

  85. select * from @t
  86. drop table tb
複製代碼
Reference: http://topic.csdn.net/u/20100511 ... e-01a471fc5841.html
 樓主| 發表於 2011-2-16 14:54:52 | 顯示全部樓層
回復 JDP 的帖子

已測試使用第二種,確定可以使用

human_id    dept_no
------------    -----------
111111       aa
111111       bb
222222       aaa
222222       bbb
222222       ccc

select human_id, dept_no = stuff((select ',' + dept_no from jdptest1 where human_id = t.human_id for xml path('')) , 1 , 1 , '')
from jdptest1 as t
group by human_id
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

Archiver|手機版|彩色筆小沛的知識庫

GMT+8, 2024-4-19 04:22 , Processed in 0.015865 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回復 返回頂部 返回列表