SQL Server 开发之数据记录拼接聚合
添加时间:2013-5-16 17:20:19
添加:
思海网络
在SQL Server 2000 中提供了一些聚合函数,例如SUM、AVG、COUNT、MAX和MIN函数。然而有时候可能要对字符串型的数据进行拼接。例如,把学生的选课情况以逗号分割进行显示等等。
这种需求与SQL Server提供的聚合具有同一个性质,都是原本可能是多个记录,按某一个字段经过汇总处理后变成一条记录。
例如学生选课的数据视图(通常是会有学生表、课程表、学生选课表关联而成)中的数据如下:
学号 选择课程
050301 数据库原理
050301 操作系统
050302 数据库原理
050302 数据结构
050303 操作系统
050303 数据结构
050303 面向对象程序设计
050301 数据库原理
050301 操作系统
050302 数据库原理
050302 数据结构
050303 操作系统
050303 数据结构
050303 面向对象程序设计
而需要的数据可能是如下的结构:
学号 选择课程
050301 数据库原理,操作系统
050302 数据库原理,数据结构
050303 操作系统,数据结构,面向对象程序设计
050301 数据库原理,操作系统
050302 数据库原理,数据结构
050303 操作系统,数据结构,面向对象程序设计
要实现这种功能,可以有两种选择,一种使用游标,另一种方法是使用用户自定义函数。为了简单,下面就创建一个StudentCourse表,该表包括学号和选择课程两个字段。
使用游标来实现
declare C1 cursor for
select StudentId,CourseName from StudentCourse
declare @StudentId varchar(10)
declare @CourseName varchar(50)
declare @Count int
if object_id('TmpTable') is not null
drop table TmpTable
create table TmpTable(StudentId varchar(10),CourseName varchar(1024))
open C1
fetch next from C1 into @StudentId,@CourseName
while @@FETCH_STATUS = 0
begin
select @Count = count(*) from TmpTable where StudentId=@StudentId
if @Count = 0
insert into TmpTable select @StudentId, @CourseName
else
update TmpTable Set CourseName = CourseName + ',' + @CourseName where StudentId=@StudentId
fetch next from C1 ino @StudentId,@CourseName
end
close C1
deallocate C1
select * from TmpTable order by StudentId
select StudentId,CourseName from StudentCourse
declare @StudentId varchar(10)
declare @CourseName varchar(50)
declare @Count int
if object_id('TmpTable') is not null
drop table TmpTable
create table TmpTable(StudentId varchar(10),CourseName varchar(1024))
open C1
fetch next from C1 into @StudentId,@CourseName
while @@FETCH_STATUS = 0
begin
select @Count = count(*) from TmpTable where StudentId=@StudentId
if @Count = 0
insert into TmpTable select @StudentId, @CourseName
else
update TmpTable Set CourseName = CourseName + ',' + @CourseName where StudentId=@StudentId
fetch next from C1 ino @StudentId,@CourseName
end
close C1
deallocate C1
select * from TmpTable order by StudentId
使用用户自定义函数来实现
create function GetCourse(@StudentId varchar(10))
returns varchar(4000)
as
begin
declare @s nvarchar(4000)
set @s=''
select @s=@s+','+ CourseName from StudentCourse
where @StudentId=StudentId
set @s=stuff(@s,1,1,'')
return @s
end
go
select distinct StudentId,dbo.GetCourse(StudentId)
from
(
select * from StudentCourse
) TmpTable
from
(
select * from StudentCourse
) TmpTable
关键字:SQL Server、数据库、记录
新文章:
- CentOS7下图形配置网络的方法
- CentOS 7如何添加删除用户
- 如何解决centos7双系统后丢失windows启动项
- CentOS单网卡如何批量添加不同IP段
- CentOS下iconv命令的介绍
- Centos7 SSH密钥登陆及密码密钥双重验证详解
- CentOS 7.1添加删除用户的方法
- CentOS查找/扫描局域网打印机IP讲解
- CentOS7使用hostapd实现无AP模式的详解
- su命令不能切换root的解决方法
- 解决VMware下CentOS7网络重启出错
- 解决Centos7双系统后丢失windows启动项
- CentOS下如何避免文件覆盖
- CentOS7和CentOS6系统有什么不同呢
- Centos 6.6默认iptable规则详解