SQL中行列转换Pivot

--建表

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)

 

 

你可能感兴趣的:(行列转换)