sql server行列转化和行列置换

 行列转换:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94

想变成(得到如下结果): 
姓名 语文 数学 物理 
---- ---- ---- ----
李四 74   84   94
张三 74   83   93

create table sc(姓名 varchar(10),课程 varchar(10),分数 float)

insert into sc
select '张三','语文',74
union
select '张三','数学',83
union
select '张三','物理',93
union
select '李四','语文',74
union
select '李四','数学',84
union
select '李四','物理',94

方法1:
declare @sql varchar(max)
set @sql='select '
select @sql=@sql+', max(case when 课程='''+课程+''' then 分数 else '''' end)['+课程+']' from (select distinct 课程 from sc)t

set @sql = STUFF(@sql,8,1,'')
print @sql
set @sql=@sql+' ,姓名 from sc group by 姓名'
exec(@sql)

方法2:

select 姓名,数学,物理,语文 from sc pivot( max(分数) for 课程 in(数学,物理,语文))t


方法3:
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from sc group by 课程
print @sql
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')


行列置换:

 

姓名  语文  数学   物理
----------------------------------
张三  80     90    85
李四  85     92    82

要求使用T-SQL语言实现以下结果:
课程  张三  李四
----------------------
语文  80    85
数学  90    92
物理  85    82

drop table sc

create table sc(姓名 varchar(10),语文 int,数学 int,物理 int)

insert into sc
select '张三',80,90,85
union all
select '李四',85,92,82

select * from sc

-------------这个过程不就是unpivot,有时间再补充?
select * into sc1 from(
select 姓名,'语文' 课程,语文 分数 from sc
union
select 姓名,'数学' 课程,数学 from sc
union
select 姓名,'物理' 课程,物理 from sc
)t

补充unpivot,和上面操作时同样的效果
select  姓名,课程,分数 into #sc1 from sc unpivot(分数 for 课程 in([语文],[数学],[物理]))a
 
declare @sql varchar(8000)
set @sql='select '
select @sql=@sql+', max(case when 姓名='''+姓名+''' then 分数 else ''''end)['+姓名+']' from (select distinct 姓名 from 

sc1)t
set @sql=stuff(@sql,8,1,'')
set @sql=@sql+' ,课程 from sc1 group by 课程'
print @sql
exec(@sql)




 
补充动态pivot和unpiot
--------------pivot
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
print @sql
set @sql = '[' + @sql + ']'
exec ('select *  from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')


--------------unpivot
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + name from syscolumns where id=OBJECT_ID('tb') and colorder>1
set @sql = '[' + @sql + ']'
exec ('select 姓名,课程,分数 from (select * from tbtb) a unpivot (分数 for 课程 in (' + @sql + ')) b')



 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值