IT忍者神龟之 oracle行转列、列转行

一、行转列

须要将例如以下格式

转换为:

这就是最常见的行转列,主要原理是利用decode函数、聚集函数(sum)。结合group by分组实现的

[sql] view plaincopy

  1. create table test(
  2. id varchar2(255) primary key not null,
  3. name varchar2(255),
  4. course varchar2(255),
  5. score varchar2(255)
  6. );
  7. insert into test values(sys_guid(),‘zhangsan‘,‘语文‘,85);
  8. insert into test values(sys_guid(),‘zhangsan‘,‘数学‘,78);
  9. insert into test values(sys_guid(),‘zhangsan‘,‘英语‘,90);
  10. insert into test values(sys_guid(),‘lisi‘,‘语文‘,73);
  11. insert into test values(sys_guid(),‘lisi‘,‘数学‘,84);
  12. insert into test values(sys_guid(),‘lisi‘,‘英语‘,92);

行转列SQL语句为:

[sql] view plaincopy

  1. select t.name,
  2. sum(decode(t.course, ‘语文‘, score,null)) as chinese,
  3. sum(decode(t.course, ‘数学‘, score,null)) as math,
  4. sum(decode(t.course, ‘英语‘, score,null)) as english
  5. from test t
  6. group by t.name
  7. order by t.name

二、列转行

将例如以下格式

转换为

这就是最常见的列转行。主要原理是利用SQL里面的union

[sql] view plaincopy

  1. create table test(
  2. id varchar2(255) primary key not null,
  3. name varchar2(255),
  4. ch_score   varchar2(255),
  5. math_score varchar2(255),
  6. en_score   varchar2(255)
  7. );
  8. insert into test values(sys_guid(),‘zhangsan‘,88,76,90);
  9. insert into test values(sys_guid(),‘lisi‘,91,67,82);

列转行SQL语句为:

[sql] view plaincopy

  1. select name, ‘语文‘ COURSE , ch_score as SCORE from test
  2. union select name, ‘数学‘ COURSE, MATH_SCORE as SCORE from test
  3. union select name, ‘英语‘ COURSE, EN_SCORE as SCORE from test
  4. order by name,COURSE
时间: 2024-11-05 08:34:09

IT忍者神龟之 oracle行转列、列转行的相关文章

IT忍者神龟之oracle 在分组内排序的方法回顾

oracle分析函数十分强大,我们只要掌握这些方法,更直接的说法就是知道这些分析函数的作用就能完成很多工作. 下边贴出这些函数,及简单应用. 其中我想对lag()和lead()函数坐下说明:lag()本身是延后的意思也就是延后出现某列的数,而lead()有引领.领先的意思也就是提前几行显示某列数据 RANK() dense_rank() [语法]RANK ( ) OVER ( [query_partition_clause] order_by_clause ) dense_RANK ( ) OV

IT忍者神龟之命令行执行java程序

第一:简单的命令行(没有package) c:/temp/bin/GetGreeting.java [java] view plaincopy public class GetGreeting { public static void main(String [] args) { System.out.println("Hello world"); } } 1.编译:cmd--cd到c:/temp/bin  javac GetGreeting.java 生成GetGreeting.cl

IT忍者神龟之Oracle查询树形结构

Oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的, 其基本语法是: ------------------------------------------------------------------------------------- select * from 表名start with 查询条件1 connect by  查询条件2 where 查询条件3; ------------

IT忍者神龟之oracle 集合的使用

每组查询均能得到其结果集,若需将多个查询结果合并成一个结果集,则可利用集合运算来实现. 如并集(UNION).并集且不去除重复行(UNOIN  ALL).交集(INTERSECT).差集(MINUS). 集合命令的目的是将两个(含以上)SQL语句产生的结果合并.由于需要将两个(含以上)数据集合并 因此字段数量必须相等,且类型也必须兼容.如果字段数量无法相同,可以将不足部分以NULL值取代, 以使其字段数量符合要求. 新建两张表并插入数据进行测试: [sql] view plaincopy cre

IT忍者神龟之Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法

在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中 2. 建立数据库间的 dblink,然后用 create table B as select * from [email protected] where ...,或 insert into B select * from [email protected] where ... 3. exp A 表,再 imp 到

IT忍者神龟之oracle 中一个用户怎么可以不使用用户名访问其他用户的表

故事背景是这样的:一个项目大概涉及到4个工程同时开发,在我自己的工程中需要做一个报表,但是要访问另一个工程所连接的DB,当然两个工程的DB Server是在同一个IP上,也就是说我们之间只是schema不一样,那我怎样完成下面的报表的开发呢? 一开始我直接创建了一个DBLink,但是回头和同时沟通,他认为DBLink的影响过大,当两个数据库不在同一个服务器上的时候才会用到这个,当前的情况最好用schema,但是此处还是把创建DBLink的方法写出来方便记忆: create database li

IT忍者神龟之Oracle 树操作(select…start with…connect by…prior)

oracle树查询的最重要的就是select-start with-connect by-prior语法了.依托于该语法,我们可以将一个表形结构的以树的顺序列出来.在下面列述了oracle中树型查询的常用查询方式以及经常使用的与树查询相关的oracle特性函数等,在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等. 1.准备测试表和测试数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

IT忍者神龟之oracle connect by用法回顾

先用scott用户下的emp表做实验. emp表有个字段,一个是empno(员工编号),另一个是mgr(上级经理编号) 下面是表中所有数据 1 select * from emp start with empno=7698 connect by  mgr=prior empno; 执行结果如下: 得到的结果是empno=7698的数据,以及会得到mgr=7698的数据. 它是向下递归的, 即我们从empno=7698开始遍历,去找出mgr=7698的所有数据S(用S代表查出的所有数据.), 然后

IT忍者神龟之Oracle DBA常用查询吐血列举

–1. 查询系统所有对象 select owner, object_name, object_type, created, last_ddl_time, timestamp, status from dba_objects where owner=upper('scott') –2. 查看系统所有表 select owner, table_name, tablespace_name from dba_tables –3. 查看所有用户的表 select owner, table_name, ta