zoukankan      html  css  js  c++  java
  • 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')  
  • 相关阅读:
    ##3.Keystone 验证服务--openstack
    gitlab一键安装+配置(备份+LADP认证)
    【hexo】03config文件配置详解
    【hexo】01安装
    第6章 linux的文件权限与目录配置
    ubuntu14.04安装Anaconda
    ubuntu14.04安装opencv-python
    ubuntu14.04配置face_recognition环境
    php7 安装时需求的依赖包
    删除包的时候因为依赖关系导致失败的解决方法
  • 原文地址:https://www.cnblogs.com/shiyh/p/6687087.html
Copyright © 2011-2022 走看看