create table 成绩表(学号 int identity(1,1),姓名 varchar(10),科目 varchar(10),成绩 int)
insert 成绩表 select '张三','语文',80
insert 成绩表 select '李四','语文',83
insert 成绩表 select '王五','英语',99
insert 成绩表 select '李四','数学',88
insert 成绩表 select '张三','英语',66
insert 成绩表 select '王五','数学',87
insert 成绩表 select '李四','英语',69
insert 成绩表 select '张三','数学',63
insert 成绩表 select '王五','语文',77select 科目, ???? from 成绩表 group by 科目
要显示成:(就是group by 科目后没group by的姓名累加起来)科目 学生
-------------
语文 张三+李四+王五
insert 成绩表 select '张三','语文',80
insert 成绩表 select '李四','语文',83
insert 成绩表 select '王五','英语',99
insert 成绩表 select '李四','数学',88
insert 成绩表 select '张三','英语',66
insert 成绩表 select '王五','数学',87
insert 成绩表 select '李四','英语',69
insert 成绩表 select '张三','数学',63
insert 成绩表 select '王五','语文',77select 科目, ???? from 成绩表 group by 科目
要显示成:(就是group by 科目后没group by的姓名累加起来)科目 学生
-------------
语文 张三+李四+王五
insert 成绩表 select '张三','语文',80
insert 成绩表 select '李四','语文',83
insert 成绩表 select '王五','英语',99
insert 成绩表 select '李四','数学',88
insert 成绩表 select '张三','英语',66
insert 成绩表 select '王五','数学',87
insert 成绩表 select '李四','英语',69
insert 成绩表 select '张三','数学',63
insert 成绩表 select '王五','语文',77go
--写一个聚合函数:
create function dbo.fn_Merge(@科目 varchar(1000))
returns varchar(8000)
as
begin
declare @name varchar(8000)
set @name=''
select @name=@name+'+'+姓名 from 成绩表 where 科目=@科目
return stuff(@name,1,1,'')
end
go-- 调用函数
select 科目, dbo.fn_Merge(科目) as 姓名 from 成绩表 group by 科目
drop table 成绩表
drop function fn_Merge
insert 成绩表 select '张三','语文',80
insert 成绩表 select '李四','语文',83
insert 成绩表 select '王五','英语',99
insert 成绩表 select '李四','数学',88
insert 成绩表 select '张三','英语',66
insert 成绩表 select '王五','数学',87
insert 成绩表 select '李四','英语',69
insert 成绩表 select '张三','数学',63
insert 成绩表 select '王五','语文',77create function fun(@科目 nvarchar(10))
returns nvarchar(200)
as
begin
declare @re nvarchar(200)
set @re=''
select @re=@re+','+姓名 from 成绩表 where 科目=@科目 return stuff(@re,1,1,'')
end
select 科目,dbo.fun(科目) as 学生
from 成绩表 group by 科目
2、用游标
使用自定义函数是最简单的方式。