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)
*/

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在SQL,可以使用GROUP BY子句结合聚合函数来合并具有相同字段值的多记录。 假设有一个名为"student"的表,包含了学生的姓名(name)、年龄(age)和性别(gender)字段。现在我们想要找出相同姓名的学生,并将他们的年龄的总和计算出来。 可以使用以下语句来实现: SELECT name, SUM(age) as total_age FROM student GROUP BY name 上述语句,首先使用GROUP BY子句根据姓名字段对记录分组,然后使用SUM函数计算每个分组的年龄的总和,并将结果命名为total_age。最终的结果将会显示每个姓名以及对应的年龄总和。 比如,如果表有以下数据: 姓名 | 年龄 | 性别 ----|-----|----- 张三 | 18 | 男性 张三 | 20 | 女性 李四 | 22 | 男性 李四 | 25 | 女性 执以上SQL语句后,将会得到以下结果: 姓名 | 总年龄 ----|------ 张三 | 38 李四 | 47 可以看到,相同姓名的学生的年龄被合并,并计算出了总和。 这样,我们就使用SQL成功地合并了多记录相同字段值的数据。 ### 回答2: 在SQL,我们可以使用聚合函数和GROUP BY子句来合并记录的相同字段值。 首先,我们需要使用SELECT语句选择需要合并的字段以及需要进聚合的字段。例如,我们有一个名为"students"的表格,包含学生的学号(StudentID)和成绩(Score)两个字段,我们要合并相同学号的成绩,可以使用以下语句: SELECT StudentID, SUM(Score) AS TotalScore FROM students GROUP BY StudentID 上述语句,我们使用GROUP BY语句将相同的学号进分组,然后使用SUM函数对每个分组的成绩进求和。使用AS关键字可以给聚合后的结果起一个别名,这里将聚合后的成绩总和命名为TotalScore。 执这条语句后,就可以得到一个合并了相同学号成绩的结果集。结果集每一表示一个学号以及该学号对应的成绩总和。 除了SUM函数外,还可以使用其他聚合函数如COUNT、AVG、MAX或MIN等来合并记录的字段值,具体根据需求进选择。 注意,在使用GROUP BY子句时,除了选择的字段外,其他非聚合字段(如姓名、年龄等)都需要包含在GROUP BY子句。 ### 回答3: 在SQL,要合并记录的相同字段值,可以使用聚合函数和GROUP BY语句进操作。 假设有一个名为"student"的表,其包含学生姓名和对应的成绩。现在我们要合并相同姓名的学生成绩,可以使用以下SQL语句: SELECT 姓名, SUM(成绩) AS 总成绩 FROM student GROUP BY 姓名 上述语句,我们使用了聚合函数SUM来求得每个学生的总成绩。同时,通过GROUP BY语句将相同姓名的记录分组,使得合并操作只对相同姓名的记录有效。 通过以上的SQL查询,我们可以得到合并后的结果,其包含每个学生的姓名和对应的总成绩。这样就实现了合并记录的相同字段值的目的。 需要注意的是,如果有其他需要合并的字段,可以在SELECT语句添加相应的字段,并且在GROUP BY语句也要对应地加入这些字段。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值