`

Oracle行列互换 横表和纵表

阅读更多
SQL代码
  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工作中总会碰到将某一列的值放到标题中显示.就是总说的行列转换或者互换.
比如有如下数据:
ID NAME       KECHENG              CHENGJI
-- ---------- -------------------- -------
1  a          语文                 80     
2  a          数学                 70     
3  b          语文                 40     
4  b          数学                 100    
5  c          语文                 90     
6  c          数学                 92
那末我要求显示的结果是:
NAME       YUWEN                  SHUXUE                
---------- ---------------------- ----------------------
a          80                     70   
也就是说把课程这一列放到行上显示.把成绩按照课程分配到相对应的行.
我只介绍2中简单易用的方法,使用游标或者建立临时表的方法就不介绍了.效率很慢,不易理解.
首先建立表:
*/

create table fzq
(
id varchar(2),
name varchar(10),
kecheng varchar(20),
chengji varchar(3)
);


--插入数据:
insert into fzq values ('1','a','语文','80');
insert into fzq values('2','a','shuxue','70');
insert into fzq values ('3','b','yuwen','40');
insert into fzq values ('4','b','shuxu','100');
insert into fzq values ('5','c','yuwen','90');
insert into fzq values ('6','c','shuxu','92');

/*首先使用union.如果课程这列有多个值,那么脚本的代码就很长了.*/

select name,sum(yuwen) yuwen,sum(shuxue) shuxue from
(
select name,chengji yuwen,'0' shuxue from fzq
where kecheng='yuwen' union
select name,'0' yuwen,chengji  shuxue
from fzq
where kecheng='shuxue'
) aaa
group BY name;

/*执行结果:
NAME       YUWEN                  SHUXUE                
---------- ---------------------- ----------------------
a          80                     70                    
b          40                     100                   
c          90                     92
*/
/*
其次是用case.这种方法代码比较短.适合列值很多的情况.
*/

select name, sum(case kecheng when 'yuwen' then chengji end) yuwen,
             sum(case kecheng  when 'shuxue' then chengji  end) shuxue
from fzq
group by name;

/*执行结果:
NAME       YUWEN                  SHUXUE                
---------- ---------------------- ----------------------
a          80                     70                    
b          40                     100                   
c          90                     92
所有例子在oracle中测试,sql server没有测试,请根据实际情况修改

如果有更好的方法,欢迎交流.
*/






横表和纵表





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

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

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

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

纵表转横表

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数据库 行列互换

    在Oracle数据库中,"行列互换"是一种常见的数据处理需求,它涉及到将数据表中的行转换为列,或者将列转换为行。这个过程在数据分析、报表制作或数据展示时非常有用。以下是对这个主题的详细解释: 一、行转列 在...

    oracle_lhr_行列互换总结

    综上所述,Oracle行列互换是一项重要的技术,掌握这些转换方法对于数据分析师和数据库管理员而言至关重要。通过对不同场景下行列互换方法的掌握,可以更加灵活地处理数据,满足不同业务场景的需求。在实践过程中,...

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

    ### Oracle SQL 中的行列互换技术详解 #### 一、引言 在处理数据库查询时,我们经常会遇到需要对查询结果进行格式调整的情况,其中一种常见的需求就是将数据的行列进行互换。例如,原始数据可能按列的形式存储了...

    Oracle行列转换

    通过下载提供的`Oracle补充内容_行列转换.sql`文件,你可以看到具体的SQL示例和实际操作,这将帮助你更好地理解和掌握Oracle的行列转换技巧。在实践中,理解并熟练运用这些技术,将有助于你更有效地处理和展示数据,...

    sql行列互换

    对于 Oracle 数据库,实现行列互换的方法与 SQL Server 和 MySQL 类似,主要也是利用 `CASE WHEN` 语句。由于 Oracle 和 MySQL 在语法上较为相似,因此这里不再给出具体示例代码。 ### 结论 通过以上三个例子可以...

    SQL语句实现对数据库查询结果的行列互换

    当我们要进行行列互换时,通常涉及到的是将某一列的值转换为行,或者将多行数据合并为一列。以下是一些常见的方法: 1. **使用UNION ALL操作符** 如果你希望将多行数据合并成一列,可以使用UNION ALL。假设我们有...

    Oracle高级sql学习与练习

    6. DECODE函数和行列互换则是对数据进行条件处理和转置的重要工具。DECODE函数类似于IF-THEN-ELSE的逻辑,允许在SQL查询中进行条件判断。 7. CASE表达式是SQL中的条件表达式,类似于编程语言中的switch-case结构,...

    关于oracle decode函数的用法

    通过以上实例可以看出,DECODE函数在Oracle数据库中是一个非常灵活且强大的工具,能够帮助我们在查询中实现复杂的条件判断和数据处理,特别是在需要进行行列互换、数据聚合等场景下,DECODE函数的应用显得尤为关键。

    oracle高级sql讲解课程

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

    ORACLE 常用sql专题讲解

    在Oracle数据库管理中,SQL(Structured Query Language)是不可或缺的一部分,尤其对于数据查询、操作和管理至关重要。本专题将深入探讨几个在Oracle中常用的SQL特性,包括行列转化、MERGE INTO语句、CASE表达式、...

    SQL行列转换

    在实际的数据分析和报表制作过程中,我们经常需要将数据的列与行进行互换,这就是所谓的“SQL行列转换”。这种操作在处理汇总数据、创建透视表或者进行特定统计分析时尤其常见。以下我们将详细探讨SQL中的行列转换...

    Sql和jdbc教程(私塾在线)视频配套学习资料

    - **行列转换**:利用SQL函数实现数据的行列互换,如使用PIVOT和UNPIVOT函数。 - **分页查询**:通过LIMIT或ROWNUM等关键字实现数据的分页显示。 - **处理树形结构**:利用自连接或者递归查询等方式处理数据库中的树...

    经典SQL脚本大全

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

    高级SQL学习

    ### 六、DECODE 函数和行列互换 **DECODE**:用于进行条件判断,类似于IF-THEN-ELSE语句。 **示例**: 假设有一个表 `Scores` 包含学生的分数,要将其转换为等级: ```sql SELECT StudentID, Score, DECODE(Score,...

    Sqlserver2000经典脚本

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

    SQL 通过行动态生成列

    在SQL查询中,将行数据转换为列,也称为行转列或行列互换,是数据分析和报表制作中常见的需求。这种操作对于呈现表格数据,尤其是处理统计汇总时非常有用。"SQL 通过行动态生成列"这个主题,就是探讨如何在SQL中实现...

    Sagent Data Flow培训手册

    19. **透视**:对数据进行透视处理,即行列互换。 20. **记录编号**:为数据记录添加序号。 21. **内存排序**:在内存中对数据进行排序。 22. **磁盘排序**:当数据量过大无法完全放入内存时,采用磁盘排序。 23. **...

    做excel表格大全.doc

    - **应用背景**:在处理数据时,有时需要将表格中的行和列互换位置,以便更好地展示或分析数据。 - **操作方法**: 1. 选中需要转换的数据范围。 2. 复制选定的数据。 3. 在目标位置使用“粘贴特殊”命令,选择...

Global site tag (gtag.js) - Google Analytics