`

Oracle行列互换 横表和纵表

 
阅读更多

行列互换 
Java代码  收藏代码
  1. /* 
  2. 在实际使用sql工作中总会碰到将某一列的值放到标题中显示.就是总说的行列转换或者互换. 
  3. 比如有如下数据: 
  4. ID NAME       KECHENG              CHENGJI 
  5. -- ---------- -------------------- ------- 
  6. 1  a          语文                 80      
  7. 2  a          数学                 70      
  8. 3  b          语文                 40      
  9. 4  b          数学                 100     
  10. 5  c          语文                 90      
  11. 6  c          数学                 92 
  12. 那末我要求显示的结果是: 
  13. NAME       YUWEN                  SHUXUE                 
  14. ---------- ---------------------- ---------------------- 
  15. a          80                     70    
  16. 也就是说把课程这一列放到行上显示.把成绩按照课程分配到相对应的行. 
  17. 我只介绍2中简单易用的方法,使用游标或者建立临时表的方法就不介绍了.效率很慢,不易理解. 
  18. 首先建立表: 
  19. */  
  20.   
  21. create table fzq  
  22. (  
  23. id varchar(2),  
  24. name varchar(10),  
  25. kecheng varchar(20),  
  26. chengji varchar(3)  
  27. );  
  28.   
  29.   
  30. --插入数据:  
  31. insert into fzq values ('1','a','语文','80');  
  32. insert into fzq values('2','a','shuxue','70');  
  33. insert into fzq values ('3','b','yuwen','40');  
  34. insert into fzq values ('4','b','shuxu','100');  
  35. insert into fzq values ('5','c','yuwen','90');  
  36. insert into fzq values ('6','c','shuxu','92');  
  37.   
  38. /*首先使用union.如果课程这列有多个值,那么脚本的代码就很长了.*/  
  39.   
  40. select name,sum(yuwen) yuwen,sum(shuxue) shuxue from  
  41. (  
  42. select name,chengji yuwen,'0' shuxue from fzq  
  43. where kecheng='yuwen' union  
  44. select name,'0' yuwen,chengji  shuxue  
  45. from fzq  
  46. where kecheng='shuxue'  
  47. ) aaa  
  48. group BY name;  
  49.   
  50. /*执行结果: 
  51. NAME       YUWEN                  SHUXUE                 
  52. ---------- ---------------------- ---------------------- 
  53. a          80                     70                     
  54. b          40                     100                    
  55. c          90                     92 
  56. */  
  57. /* 
  58. 其次是用case.这种方法代码比较短.适合列值很多的情况. 
  59. */  
  60.   
  61. select name, sum(case kecheng when 'yuwen' then chengji end) yuwen,  
  62.              sum(case kecheng  when 'shuxue' then chengji  end) shuxue  
  63. from fzq  
  64. group by name;  
  65.   
  66. /*执行结果: 
  67. NAME       YUWEN                  SHUXUE                 
  68. ---------- ---------------------- ---------------------- 
  69. a          80                     70                     
  70. b          40                     100                    
  71. c          90                     92 
  72. 所有例子在oracle中测试,sql server没有测试,请根据实际情况修改 
  73.  
  74. 如果有更好的方法,欢迎交流. 
  75. */  





横表和纵表 

 

 

第一张图就是横表,一行表示了一个实体记录,这就是我们传统的设计表的形式 

第二张图就是纵表,他的一行记录,是用于表示某个学生的属性名和属性值对应关系,像这边有两个属性(名字和性别),在纵表中就要用两条记录来表示一个学生。 

从上面可以观察出,横表的好处是清晰可见,一目了然,但是有一个弊端,如果现在要把这个表加一个字段,那么就必须重建表结构。对于这种情况,在纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小,但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,两者利弊在于此。所以,应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。 

在实际开发中,经常需要互相转换横表和纵表的形式,这里贴个从纵表数据转成横表显示的形式。 

纵表转横表 

Sql代码  收藏代码
  1. Select student_no,  
  2.         max(decode(field_name,'student_name',field_value)) As student_name,  
  3.         max(decode(field_name,'student_sex',field_value )) As student_sex  
  4.     From cuc_student_y Group By student_no;  

 

分享到:
评论

相关推荐

    orcale数据库 行列互换

    orcale数据库 行列互换orcale数据库 行列互换orcale数据库 行列互换

    oracle_lhr_行列互换总结

    oracle_lhr_行列互换总结oracle_lhr_行列互换总结oracle_lhr_行列互换总结

    sql经典 oracle的查询结果的行列互换

    关于oracle的查询结果的行列互换.docx sql经典

    Oracle行列转换

    Oracle行列转换,一个挺经典的例子,值得学习和思考……

    Oracle高级sql学习与练习

    6、DECODE函数和行列互换 7、CASE表达式 8、ROWNUM-TOP-N分析 9、相关子查询和非相关子查询 10、增强GROUP BY 11、分析函数(ANALYTICAL FUNCTIONS) 12、ROWID的使用 13、ORACLE 10G正则表达式 14、使用HINT 15、...

    oracle高级sql讲解课程

    with子句使用,集合操作,case应用,行列互换,4 exists与in、not exists与not in

    经典SQL脚本大全

    │ 行列互换的复杂交叉表.sql │ 限制列数的交叉表.sql │ ├─第07章 │ │ 7.1 splitpage.asp │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 ...

    Sqlserver2000经典脚本

    多栏显示.sql │ 日期+星期+时间.sql │ 格式化报表.sql │ 横转竖-1.sql │ 横转竖-字段名.sql │ 横转竖-生成字段名.sql │ 横转竖.sql │ 行列互换的复杂交叉表.sql │...

    服务器指标要求:.docx

    1)能以图形化实时显示系统的CPU、内存、磁盘与网络资源等的资源使用情况,实现如下监控功效: CPU:多处置惩罚器系统中每个处置惩罚器的CPU使用率、CPU运行的行列长度、系统呼唤次数以及中断及情况互换机的操纵频率...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例043 将二维数组中的行列互换 53 实例044 利用数组随机抽取幸运观众 54 实例045 用数组设置JTable表格的列名与列宽 55 3.2 数组操作 57 实例046 数组的下标界限 57 实例047 按钮控件数组实现计数器界面 58 实例...

Global site tag (gtag.js) - Google Analytics