手机访问 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 数据库 > MSSQL >

sqlserver行列转换文2

2017-04-06 10:51|来源:未知 |作者:dnzg |点击:
[sql] view plain copy
行列转换: [sql] view plain copy
姓名 课程 分数 张三 语文 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')


行列置换:

 

[sql] view plain copy
姓名 语文 数学 物理 ----------------------------------
张三 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 [sql] view plain copy
补充unpivot,和上面操作时同样的效果 [sql] view plain copy
select 姓名,课程,分数 into #sc1 from sc unpivot(分数 for 课程 in([语文],[数学],[物理]))a[sql] view plain copy
[sql] view plain copy
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
(责任编辑:dnzg)