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規則詳解