加分隔符的行列转换问题?
举例:select   id,num   from   table   的结果为 
 1      2 
 2      4 
 3      6 
 等 
 要求转换为    
 1,2,3和   2,4,6 
 其中(,)为分割符号,最好写成函数。     
------解决方案------------------------创建测试数据 
 declare @t table(id int,num int) 
 insert @t 
 select 1,2 union all 
 select 2,4 union all 
 select 3,6   
 ----查询 
 declare @idList varchar(1000),@numList varchar(1000) 
 set @idList =  ' ' 
 set @numList =  ' ' 
 select  
 @idList = case @idList when  ' ' then  ' ' else @idList +  ', ' end + rtrim(id), 
 @numList = case @numList when  ' ' then  ' ' else @numList +  ', ' end + rtrim(num) 
 from @t   
 select @idList as id,@numList as num   
 /*结果 
 id      num 
 ------------------ 
 1,2,3   2,4,6 
 */
------解决方案--------------------mark
------解决方案--------------------有表tb, 如下: 
 id    value 
 ----- ------ 
 1     aa 
 1     bb 
 2     aaa 
 2     bbb 
 2     ccc   
 需要得到结果: 
 id     values 
 ------ ----------- 
 1      aa,bb 
 2      aaa,bbb,ccc   
 在SQL Server2000中我们处理的方式一般都是用自定义函数去处理: 
 举例如下:   
 create function dbo.f_str(@id int) 
 returns varchar(8000) 
 as 
 begin 
    declare @r varchar(8000) 
    set @r= ' ' 
    select @r=@r+ ', '+value from tb where id=@id 
    return stuff(@r,1,1, ' ') 
 end 
 go   
 在SQL Server2005中,这种统计有了一种新的方法,直接使用语句调用sql2005的函数实现: 
 举例如下: 
 select id, values=dbo.f_str(id) from tb group by id   
 -- 示例数据 
 DECLARE @t TABLE(id int, value varchar(10)) 
 Insert @t Select 1,  'aa ' 
 UNION ALL Select 1,  'bb ' 
 UNION ALL Select 2,  'aaa ' 
 UNION ALL Select 2,  'bbb ' 
 UNION ALL Select 2,  'ccc '   
 -- 查询处理 
 Select * 
 FROM( 
 Select DISTINCT 
 id 
 FROM @t 
 )A 
 OUTER APPLY( 
 Select [values]= STUFF(REPLACE(REPLACE( 
 ( 
 Select value FROM @t N 
 Where id = A.id 
 FOR XML AUTO 
 ),  ' <N value= " ',  ', '),  ' "/>  ',  ' '), 1, 1,  ' ') 
 )N   
 /*--结果 
 id          values 
 ----------- ---------------- 
 1           aa,bb 
 2           aaa,bbb,ccc   
 (2 行受影响) 
 --*/     
 最近从CSDN上又发现了一种方法! 
 declare @a varchar(100) 
 select @a=coalesce(@a+ '/ ', ' ')+PNAME from HPINF where perid like '207% ' 
 select @a 
------解决方案--------------------create  table t(id int,num int) 
 insert t 
 select 1,2 union all 
 select 2,4 union all 
 select 3,6 
 go   
 ---跟常见的没什么大区别,只是select时没有where而已 
 create function f1() 
 returns varchar(100)  
 as 
 begin 
 declare @s varchar(100) 
 set @s= ' ' 
 select @s=@s+ ', '+cast(id as varchar) from t  
 return stuff(@s,1,1, ' ') 
 end 
 go 
 create function f2() 
 returns varchar(100)  
 as 
 begin 
 declare @s varchar(100) 
 set @s= ' ' 
 select @s=@s+ ', '+cast(Num as varchar) from t  
 return stuff(@s,1,1, ' ') 
 end 
 go 
 select top 1 dbo.f1(),dbo.f2() from t  
 drop table t 
 drop function f1 
 drop function f2
------解决方案--------------------