SQL中合并多行记录的方法总汇

 

--  =============================================================================
--
 Title: 在SQL中分类合并数据行
--
 Author: dobear        Mail(MSN): dobear_0922@hotmail.com
--
 Environment: Vista + SQL2005
--
 Date: 2008-04-22
--
 =============================================================================

-- 1. 创建表,添加测试数据
CREATE   TABLE  tb(id  int [ value ]   varchar ( 10 ))
INSERT  tb  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 tb
/*
id          value
----------- ----------
1           aa
1           bb
2           aaa
2           bbb
2           ccc

(5 row(s) affected)
*/



-- 2 在SQL2000只能用自定义函数实现
--
--2.1 创建合并函数fn_strSum,根据id合并value值
GO
CREATE   FUNCTION  dbo.fn_strSum( @id   int )
RETURNS   varchar ( 8000 )
AS
BEGIN
    
DECLARE   @values   varchar ( 8000 )
    
SET   @values   =   ''
    
SELECT   @values   =   @values   +   ' , '   +  value  FROM  tb  WHERE  id = @id
    
RETURN   STUFF ( @values 1 1 '' )
END
GO

--  调用函数
SELECT  id, VALUE  =  dbo.fn_strSum(id)  FROM  tb  GROUP   BY  id
DROP   FUNCTION  dbo.fn_strSum

-- --2.2 创建合并函数fn_strSum2,根据id合并value值
GO
CREATE   FUNCTION  dbo.fn_strSum2( @id   int )
RETURNS   varchar ( 8000 )
AS
BEGIN
    
DECLARE   @values   varchar ( 8000 )    
    
SELECT   @values   =   isnull ( @values   +   ' , ' '' +  value  FROM  tb  WHERE  id = @id
    
RETURN   @values
END
GO

--  调用函数
SELECT  id, VALUE  =  dbo.fn_strSum2(id)  FROM  tb  GROUP   BY  id
DROP   FUNCTION  dbo.fn_strSum2


-- 3 在SQL2005中的新解法
--
--3.1 使用OUTER APPLY
SELECT   *  
FROM  ( SELECT   DISTINCT  id  FROM  tb) A  OUTER  APPLY(
        
SELECT   [ values ] =   STUFF ( REPLACE ( REPLACE (
            (
                
SELECT  value  FROM  tb N
                
WHERE  id  =  A.id
                
FOR  XML AUTO
            ), 
' <N value=" ' ' , ' ),  ' "/> ' '' ),  1 1 '' )
)N

-- --3.2 使用XML
SELECT  id,  [ values ] = STUFF (( SELECT   ' , ' + [ value ]   FROM  tb t  WHERE  id = tb.id  FOR  XML PATH( '' )),  1 1 '' )
FROM  tb
GROUP   BY  id

-- 4 删除测试表tb
drop   table  tb

/*
id          values
----------- --------------------
1           aa,bb
2           aaa,bbb,ccc

(2 row(s) affected)
*/

 
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值