参考
 
发表于:2008-10-29 10:59:201楼 得分:0 
SQL code问题描述:
无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
  所以,当我们在处理下列要求时,会比较麻烦:
有表tb, 如下:
id    value
----- ------
1     aa
1     bb
2     aaa
2     bbb
2     ccc
需要得到结果:
id     values
------ -----------
1      aa,bb
2      aaa,bbb,ccc
即, group by id, 求 value 的和(字符串相加)1. 旧的解决方法-- 1. 创建处理函数
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
-- 调用函数SELECt id, values=dbo.f_str(id) 
FROM tb 
GROUP BY id-- 2. 新的解决方法 
-- 示例数据
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 社区帖子地址 附: 合并与分拆的CLR, sql2005的示例中有:
在安装sql 2005的示例后,默认安装目录为
drive:\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中
 
 

解决方案 »

  1.   

    declare @t table(a varchar(10),b int,c varchar(10))
    insert @t select 'A', 1062, 'C40' 
    insert @t select 'B', 1108 ,'C98'
    declare @s varchar(100)
    select @s=isnull(@s,'')+','+rtrim(b)from @t
    select stuff(@s,1,1,'') 
    /*                                                                                                    
    --------------------------------------------------------------------------------------------------- 
    1062,1108
    */
      

  2.   

    改改加上where条件就可以了啊
      

  3.   

    declare @tt nvarchar(4000)set @tt ='''11098;10740'''   --11098;10740 是动态赋予变量  set @tt=replace(@tt,';',''';''')set @tt=replace(@tt,';',',')
    exec ('SELECT ID FROM Sheet1$ WHERE (编码 IN ('+@tt+'))') --根据给的动态编码显示对应的ID下面就是要把这些ID值 连接起来 如 123,345 样显示
      

  4.   

    declare @tt nvarchar(4000) set @tt ='11098;10740'  --11098;10740 是动态赋予变量  
    declare @s varchar(100)SELECT @s= isnull(@s+',','') + ltrim(ID) FROM Sheet1$ WHERE charindex(';'+@tt+';',';'+编码+';')>0 
    select @s
      

  5.   


    exec (' declare @sql varchar(8000) '+
             ' set @sql='''' '+
             ' SELECT @sql=@sql+rtrim(ID) FROM Sheet1$ WHERE (编码 IN ('+@tt+'))' +
             ' select stuff(@sql,1,1,'''')') --根据给的动态编码显示对应的ID 
      

  6.   

    呵呵...少了一个逗号exec (' declare @sql varchar(8000) '+
             ' set @sql='''' '+
             ' SELECT @sql=@sql+','+rtrim(ID) FROM Sheet1$ WHERE (编码 IN ('+@tt+'))' +
             ' select stuff(@sql,1,1,'''')') --根据给的动态编码显示对应的ID 
      

  7.   

    更正exec (' declare @sql varchar(8000) '+
             ' set @sql='''' '+
             ' SELECT @sql=@sql+'',''+rtrim(ID) FROM Sheet1$ WHERE (编码 IN ('+@tt+'))' +
             ' select stuff(@sql,1,1,'''')') --根据给的动态编码显示对应的ID 
      

  8.   

    呵呵谢谢楼上;问题解决! 在问下,呵呵 就是 显示的结果集 的顺序 不是 按 给的编码 顺序排列的,怎么按原来顺序排列;如给的变量顺序是 A,C,B,D   希望结果集 给的结果集顺序是   A_ID,C_ID,B_ID,D_ID  
     谢谢  !!!!
      

  9.   

    使用递规查询变量不支持排序即
    select @s=isnull(@s+',','') + rtrim(id) from tb order by .. 这种行不通。sql2000下两种方式:
    1,用select into from order by 将源表数据按指定顺序插入临时表。
    再用这种方式不加order by进行取。
    2,写循环。sql2005可用xml