【SQL精彩语句】合并列值

  1  -- 合并列值
  2  -- 原著:邹建
  3  -- 改编:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)  2007-12-16  广东深圳
  4 
  5  -- 表结构,数据如下:
  6  /*
  7  id    value 
  8  ----- ------ 
  9  1    aa 
 10  1    bb 
 11  2    aaa 
 12  2    bbb 
 13  2    ccc 
 14  */
 15  -- 需要得到结果:
 16  /*
 17  id    values 
 18  ------ ----------- 
 19  1      aa,bb 
 20  2      aaa,bbb,ccc 
 21  即:group by id, 求value 的和(字符串相加)
 22  */
 23  -- 1. 旧的解决方法(在sql server 2000中只能用函数解决。) 
 24  -- 1. 创建处理函数
 25  create  table tb(id  int, value  varchar( 10)) 
 26  insert  into tb  values( 1' aa '
 27  insert  into tb  values( 1' bb '
 28  insert  into tb  values( 2' aaa '
 29  insert  into tb  values( 2' bbb '
 30  insert  into tb  values( 2' ccc '
 31  go 
 32 
 33  create  function dbo.f_str( @id  int
 34  returns  varchar( 8000
 35  as 
 36  begin 
 37      declare  @r  varchar( 8000
 38      set  @r  =  '' 
 39      select  @r  =  @r  +  ' , '  + value  from tb  where id = @id 
 40      return  stuff( @r11''
 41  end 
 42  go 
 43 
 44  --  调用函数
 45  SELECt id, value  = dbo.f_str(id)  FROM tb  GROUP  BY id 
 46 
 47  drop  table tb 
 48  drop  function dbo.f_str 
 49 
 50  /*  
 51  id          value      
 52  ----------- ----------- 
 53  1          aa,bb 
 54  2          aaa,bbb,ccc 
 55  (所影响的行数为2 行)
 56  */ 
 57 
 58  -- 2、另外一种函数. 
 59  create  table tb(id  int, value  varchar( 10)) 
 60  insert  into tb  values( 1' aa '
 61  insert  into tb  values( 1' bb '
 62  insert  into tb  values( 2' aaa '
 63  insert  into tb  values( 2' bbb '
 64  insert  into tb  values( 2' ccc '
 65  go 
 66 
 67  -- 创建一个合并的函数
 68  create  function f_hb( @id  int
 69  returns  varchar( 8000
 70  as 
 71  begin 
 72    declare  @str  varchar( 8000
 73    set  @str  =  '' 
 74    select  @str  =  @str  +  ' , '  +  cast(value  as  varcharfrom tb  where id  =  @id 
 75    set  @str  =  right( @str ,  len( @str-  1
 76    return( @str
 77  End 
 78  go 
 79 
 80  -- 调用自定义函数得到结果:
 81  select  distinct id ,dbo.f_hb(id)  as value  from tb 
 82 
 83  drop  table tb 
 84  drop  function dbo.f_hb 
 85 
 86  /*  
 87  id          value      
 88  ----------- ----------- 
 89  1          aa,bb 
 90  2          aaa,bbb,ccc 
 91  (所影响的行数为2 行)
 92  */ 
 93 
 94  -- 2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。) 
 95  create  table tb(id  int, value  varchar( 10)) 
 96  insert  into tb  values( 1' aa '
 97  insert  into tb  values( 1' bb '
 98  insert  into tb  values( 2' aaa '
 99  insert  into tb  values( 2' bbb '
100  insert  into tb  values( 2' ccc '
101  go 
102  --  查询处理
103  select  *  from( select  distinct id  from tb)a  outer apply( 
104          select  [ values ] =  stuff( replace( replace
105             ( 
106                  select value  from tb n 
107                  where id  = a.id 
108                  for xml auto 
109             ),  '  <N value=" '' , '),  ' "/> '''),  11''
110 )N 
111  drop  table tb
112 
113  /*  
114  id          values 
115  ----------- ----------- 
116  1          aa,bb 
117  2          aaa,bbb,ccc 
118 
119  (2 行受影响) 
120  */ 
121 
122  -- SQL2005中的方法
123  create  table tb(id  int, value  varchar( 10)) 
124  insert  into tb  values( 1' aa '
125  insert  into tb  values( 1' bb '
126  insert  into tb  values( 2' aaa '
127  insert  into tb  values( 2' bbb '
128  insert  into tb  values( 2' ccc '
129  go 
130 
131  select id,  [ values ] = stuff(( select  ' , ' + [ value ]  from tb t  where id =tb.id  for xml path( '')),  11''
132  from tb 
133  group  by id 
134 
135  /*  
136  id          values 
137  ----------- -------------------- 
138  1          aa,bb 
139  2          aaa,bbb,ccc 
140 
141  (2 row(s) affected) 
142 
143  */ 
144 
145  drop  table tb

转载于:https://www.cnblogs.com/temptation/archive/2012/01/30/2332344.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值