SQL Server數(shù)據(jù)記錄拼接聚合
添加時間:2013-3-18 17:39:32
添加:
思海網(wǎng)絡(luò)
關(guān)于在SQL Server 2000 中提供了一些聚合函數(shù),例如SUM、AVG、COUNT、MAX和MIN函數(shù)。然而有時候可能要對字符串型的數(shù)據(jù)進(jìn)行拼接。例如,把學(xué)生的選課情況以逗號分割進(jìn)行顯示等等。
這種需求與SQL Server提供的聚合具有同一個性質(zhì),都是原本可能是多個記錄,按某一個字段經(jīng)過匯總處理后變成一條記錄。
例如學(xué)生選課的數(shù)據(jù)視圖(通常是會有學(xué)生表、課程表、學(xué)生選課表關(guān)聯(lián)而成)中的數(shù)據(jù)如下:
學(xué)生號 選擇的課程
050301 數(shù)據(jù)庫原理
050301 操作系統(tǒng)
050302 數(shù)據(jù)庫原理
050302 數(shù)據(jù)結(jié)構(gòu)
050303 操作系統(tǒng)
050303 數(shù)據(jù)結(jié)構(gòu)
050303 面向?qū)ο蟪绦蛟O(shè)計
050301 數(shù)據(jù)庫原理
050301 操作系統(tǒng)
050302 數(shù)據(jù)庫原理
050302 數(shù)據(jù)結(jié)構(gòu)
050303 操作系統(tǒng)
050303 數(shù)據(jù)結(jié)構(gòu)
050303 面向?qū)ο蟪绦蛟O(shè)計
而需要的數(shù)據(jù)可能是如下的結(jié)構(gòu):
學(xué)號 選擇課程
050301 數(shù)據(jù)庫原理,操作系統(tǒng)
050302 數(shù)據(jù)庫原理,數(shù)據(jù)結(jié)構(gòu)
050303 操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu),面向?qū)ο蟪绦蛟O(shè)計
050301 數(shù)據(jù)庫原理,操作系統(tǒng)
050302 數(shù)據(jù)庫原理,數(shù)據(jù)結(jié)構(gòu)
050303 操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu),面向?qū)ο蟪绦蛟O(shè)計
要實(shí)現(xiàn)這種功能,可以有兩種選擇,一種使用游標(biāo),另一種方法是使用用戶自定義函數(shù)。為了簡單,下面就創(chuàng)建一個StudentCourse表,該表包括學(xué)號和選擇課程兩個字段。
使用游標(biāo)來實(shí)現(xiàn)
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
使用用戶自定義函數(shù)來實(shí)現(xiàn)
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
關(guān)鍵字:SQL Server、數(shù)據(jù)記錄、拼接聚合
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解