您的位置:首页 > 数据库

SQL中行列转换Pivot

2013-10-31 00:26 363 查看
--建表
create table tb(姓名 varchar(10),课程 varchar(10),分数 int)
--插入数据
insert into tb values('张三','语文',74)
insert into tb values('张三','数学',83)
insert into tb values('张三','物理',93)
insert into tb values('李四','语文',74)
insert into tb values('李四','数学',84)
insert into tb values('李四','物理',94)


1.静态行转列(确定有哪些列)

select 姓名,
max(case 课程 when'语文' then 分数 else 0 end)语文,
max(case 课程 when'数学' then 分数 else 0 end)数学,
max(case 课程 when'物理' then 分数 else 0 end)物理
from tb
group by 姓名


2.动态行转列(不确定有哪些列)

declare @sql varchar(500)
set @sql='select 姓名'
select @sql=@sql+',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'
from(select distinct 课程 from tb) a --同from tb group by课程,默认按课程名排序
set @sql=@sql+' from tb group by 姓名'
exec(@sql)


或者

declare @sql varchar(8000)
select @sql=isnull(@sql+',','')+' max(case 课程 when '''+课程+''' then 分数 else 0 end) ['+课程+']'
from(select distinct 课程 from tb) a
select @sql
set @sql='select 姓名,'+@sql+' from tb group by 姓名'
exec(@sql)


使用prvot

select * from tb pivot(max(分数)for 课程 in(语文,数学,物理))a


declare @sql varchar(8000)
set @sql=''  --初始化变量@sql
select @sql=@sql+','+课程 from tb group by 课程--变量多值赋值
set @sql=stuff(@sql,1,1,'')--去掉首个','
set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'
exec(@sql)


declare @sql varchar(8000)
--获得课程集合
select @sql=isnull(@sql+',','')+课程 from tb group by 课程
set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'
exec(@sql)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: