


SQL Server數據記錄拼接聚合
添加時間:2013-3-18 17:39:32
添加:
思海網絡
關于在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規則詳解