sql server行列转化和行列置换

  1.  行列转换:  
  1. 姓名 课程 分数  
  2. 张三 语文 74  
  3. 张三 数学 83  
  4. 张三 物理 93  
  5. 李四 语文 74  
  6. 李四 数学 84  
  7. 李四 物理 94  
  8.   
  9. 想变成(得到如下结果):   
  10. 姓名 语文 数学 物理   
  11. ---- ---- ---- ----  
  12. 李四 74   84   94  
  13. 张三 74   83   93  
  14.   
  15. create table sc(姓名 varchar(10),课程 varchar(10),分数 float)  
  16.   
  17. insert into sc  
  18. select '张三','语文',74  
  19. union  
  20. select '张三','数学',83  
  21. union  
  22. select '张三','物理',93  
  23. union  
  24. select '李四','语文',74  
  25. union  
  26. select '李四','数学',84  
  27. union  
  28. select '李四','物理',94  
  29.   
  30. 方法1:  
  31. declare @sql varchar(max)  
  32. set @sql='select '  
  33. select @sql=@sql+', max(case when 课程='''+课程+''' then 分数 else '''' end)['+课程+']' from (select distinct 课程 from sc)t  
  34.   
  35. set @sql = STUFF(@sql,8,1,'')  
  36. print @sql  
  37. set @sql=@sql+' ,姓名 from sc group by 姓名'  
  38. exec(@sql)  
  39.   
  40. 方法2:  
  41.   
  42. select 姓名,数学,物理,语文 from sc pivot( max(分数) for 课程 in(数学,物理,语文))t  
  43.   
  44.   
  45. 方法3:  
  46. declare @sql varchar(8000)  
  47. select @sql = isnull(@sql + '],[' , '') + 课程 from sc group by 课程  
  48. print @sql  
  49. set @sql = '[' + @sql + ']'  
  50. exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')  


行列置换:

 

  1. 姓名  语文  数学   物理  
  2. ----------------------------------  
  3. 张三  80     90    85  
  4. 李四  85     92    82  
  5.   
  6. 要求使用T-SQL语言实现以下结果:  
  7. 课程  张三  李四  
  8. ----------------------  
  9. 语文  80    85  
  10. 数学  90    92  
  11. 物理  85    82  
  12.   
  13. drop table sc  
  14.   
  15. create table sc(姓名 varchar(10),语文 int,数学 int,物理 int)  
  16.   
  17. insert into sc  
  18. select '张三',80,90,85  
  19. union all  
  20. select '李四',85,92,82  
  21.   
  22. select * from sc  
  23.   
  24. -------------这个过程不就是unpivot,有时间再补充?  
  25. select * into sc1 from(  
  26. select 姓名,'语文' 课程,语文 分数 from sc  
  27. union  
  28. select 姓名,'数学' 课程,数学 from sc  
  29. union  
  30. select 姓名,'物理' 课程,物理 from sc  
  31. )t  
  1. 补充unpivot,和上面操作时同样的效果  
  1. select  姓名,课程,分数 into #sc1 from sc unpivot(分数 for 课程 in([语文],[数学],[物理]))a  
  1.    
  1. declare @sql varchar(8000)  
  2. set @sql='select '  
  3. select @sql=@sql+', max(case when 姓名='''+姓名+''' then 分数 else ''''end)['+姓名+']' from (select distinct 姓名 from   
  4.   
  5. sc1)t  
  6. set @sql=stuff(@sql,8,1,'')  
  7. set @sql=@sql+' ,课程 from sc1 group by 课程'  
  8. print @sql  
  9. exec(@sql)  
  1.    
  1. 补充动态pivot和unpiot  
    1. --------------pivot  
    2. declare @sql varchar(8000)  
    3. select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程  
    4. print @sql  
    5. set @sql = '[' + @sql + ']'  
    6. exec ('select *  from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')  
    7.   
    8.   
    9. --------------unpivot  
    10. declare @sql varchar(8000)  
    11. select @sql = isnull(@sql + '],[' , '') + name from syscolumns where id=OBJECT_ID('tb') and colorder>1  
    12. set @sql = '[' + @sql + ']'  
    13. exec ('select 姓名,课程,分数 from (select * from tbtb) a unpivot (分数 for 课程 in (' + @sql + ')) b') 

转载于:https://www.cnblogs.com/Impulse/articles/5129319.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值