(轉)sql server行列轉化和行列置換


[sql]  view plain  copy
 
  1.  行列轉換:  
[sql]  view plain  copy
 
  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')  


行列置換:

 

[sql]  view plain  copy
 
  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  
[sql]  view plain  copy
 
  1. 補充unpivot,和上面操作時同樣的效果  
[sql]  view plain  copy
 
  1. select  姓名,課程,分數 into #sc1 from sc unpivot(分數 for 課程 in([語文],[數學],[物理]))a  
[sql]  view plain  copy
 
  1.    
[sql]  view plain  copy
 
  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)  
[sql]  view plain  copy
 
  1.    
[sql]  view plain  copy
 
  1. 補充動態pivot和unpiot  
[sql]  view plain  copy
 
    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')  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM