T-SQL同一列多行数据合并成一行

--create table
create table ##Course(cid int identity(1,1) primary key,cname nvarchar(20))
--insert
insert into ##Course(cname) values('语文')
insert into ##Course(cname) values('数学')
insert into ##Course(cname) values('英语')

上面是课程表结构及数据,下边我们想看下总共有多少门课程,显示格式"课程1,课程2,...",脚本如下:

declare @stus nvarchar(200)
set @stus = '' --必须,否则print没有内容
select @stus = @stus + ',' + cname from ##Course
set @stus = substring(@stus,2,len(@stus)-1)
print @stus --语文,数学,英语


在行转列中的应用

增加学生表及数据:

--create table
create table ##Student(sid int identity(1,1) primary key,sname nvarchar(50),cid int,score float)
--insert
insert into ##Student(sname,cid,score) values('张三',1,50)
insert into ##Student(sname,cid,score) values('张三',2,60)
insert into ##Student(sname,cid,score) values('张三',3,70)
insert into ##Student(sname,cid,score) values('李四',1,80)
insert into ##Student(sname,cid,score) values('李四',2,90)
insert into ##Student(sname,cid,score) values('李四',3,100)

查询:

declare @sql nvarchar(500)
set @sql = 'select sname [学生]'
select @sql = @sql + ',max(case cid when ' + convert(varchar,cid) + ' then score else 0 end) [' + cname + ']' from ##Course
set @sql = @sql + ' from ##Student group by sname'
execute(@sql)

结果:

引用内容 引用内容
学生    语文    数学    英语
李四    80    90    100
张三    50    60    70


参考文章

·SQL语句定义动态列头:http://www.cnblogs.com/ajunsoft/archive/2009/03/30/1425238.html

评论: 0 | 引用: 0 | 查看次数: 7858
发表评论
登录后再发表评论!