日期:2014-05-18  浏览次数:20449 次

sql 2000 合并行的问题


SQL code

SELECT  JDBH ,
                        JSBM = STUFF(( SELECT   ',' + jdbm
                                       FROM     View_SzGcxm_old t
                                       WHERE    jdbh = z.jdbh
                                     FOR
                                       XML PATH('')
                                     ), 1, 1, '') ,
                        XXJDY = STUFF(( SELECT  ',' + jdxz
                                        FROM    View_SzGcxm_old t
                                        WHERE   jdbh = z.jdbh
                                      FOR
                                        XML PATH('')
                                      ), 1, 1, '') ,
                        jdbmName = STUFF(( SELECT   ',' + jdbmName
                                           FROM     View_SzGcxm_old t
                                           WHERE    jdbh = z.jdbh
                                         FOR
                                           XML PATH('')
                                         ), 1, 1, '')
                FROM    View_SzGcxm_old z
                GROUP BY jdbh


在2005中用上面的方式,飞快的完成,但是在2000中不行,不支持 for Xml path

CREATE TABLE [dbo].[testDT](
  [bh] [varchar](50) NULL,
  [name] [varchar](50) NULL,
  [sex] [int] NULL,
  [email] [varchar](50) NULL



 内容

12 li 1 122@qq.com
12 li 1 133@qq.com
15 wang 0 33@qq.com
13 zhang 1 22@qq.com
13 zhang 1 22@qq.com

想要的结果

bh name email
12 li,li 122@qq.com,133@qq.com
15 wang 33@qq.com
13 zhang,zhang 22@qq.com,22@qq.com


如果编号相同,合并其名称,以及邮件

------解决方案--------------------
SQL code
if not object_id('B') is null
    drop table B
Go
Create table B([id] int,[cname] nvarchar(5))
Insert B
select 1,N'1,2,3' union all
select 2,N'3,4'
Go
create function F_str(@cname nvarchar(100))
returns nvarchar(100)
as
begin 
select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')>0
return @cname
end
go
select [id],dbo.F_str([cname])[cname] from B

id          cname
1           张三,李四,王五
2           王五,蔡六

------解决方案--------------------
SQL code
表a 
name    num 
aa      1 
bb      2 
cc      4 
dd      4 
ee      2 
一条语句实现如下:
name 
aa,bb,cc,dd,ee 
DECLARE @STR VARCHAR(8000)
SELECT @STR=ISNULL(@STR+',','')+name FROM (SELECT DISTINCT NAME FROM A)AS T
SELECT @STR
问题描述:
无论是在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 行受影响)
--*/
--各种字符串分函数
--3.3.1 使用游标法进行字符串合并处理的示例。
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int