在报表的开发当中,难免会遇到行转列的问题。

以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用“行转列”:

scott的emp的原始数据为:

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 12/17/1980 800.00   20
7499 ALLEN SALESMAN 7698 2/20/1981 1600.00 300.00 30
7521 WARD SALESMAN 7698 2/22/1981 1250.00 500.00 30
7566 JONES MANAGER 7839 4/2/1981 2975.00   20
7654 MARTIN SALESMAN 7698 9/28/1981 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 5/1/1981 2850.00   30
7782 CLARK MANAGER 7839 6/9/1981 2450.00   10
7788 SCOTT ANALYST 7566 4/19/1987 3000.00   20
7839 KING PRESIDENT   11/17/1981 5000.00   10
7844 TURNER SALESMAN 7698 9/8/1981 1500.00 0.00 30
7876 ADAMS CLERK 7788 5/23/1987 1100.00   20
7900 JAMES CLERK 7698 12/3/1981 950.00   30
7902 FORD ANALYST 7566 12/3/1981 3000.00   20
7934 MILLER CLERK 7782 1/23/1982 1300.00   10

使用“行转列”统计各职位的人员在各部门的分布人数后,数据为:

JOB 10(DEPTNO) 20(DEPTNO) 30(DEPTNO) 40(DEPTNO)
CLERK 1 2 1 0
SALESMAN 0 0 4 0
PRESIDENT 1 0 0 0
MANAGER 1 1 1 0
ANALYST 0 2 0 0

一、经典的实现方式

主要是利用decode函数、聚合函数(如max、sum等)、group by分组实现的

   select t.job, count(decode(t.deptno, '', )) as "10(DEPTNO)",
count(decode(t.deptno, '', )) as "20(DEPTNO)",
count(decode(t.deptno, '', )) as "30(DEPTNO)",
count(decode(t.deptno, '', )) as "40(DEPTNO)"
from scott.emp t
group by t.job;

二、PIVOT

Oracle 11g后,出现PIVOT,更简便地实现“行转列”。使用前,需确定数据库环境大于11g,最好也确认下生产环境的数据库是否大于11g,避免项目后期出现状况。

 with tmp_tab as(
select t.job, t.deptno
from scott.emp t
)
select * from tmp_tab t pivot(count() for deptno in (, , , ));

三、PIVOT XML

使用经典的方法和PIVOT方法,DEPTNO的参数是硬编码的。而通过PIVOT XML能解决这一问题,使分列条件可以是动态的。但,输出的是XML的CLOB的格式。目前,Java读取PIVOT XML CLOB貌似比较困难(本人没有成功读取,可见下文描述,如有知晓者,请知悉)。

 with tmp_tab as(
select t.job, t.deptno
from scott.emp t
)
select * from tmp_tab t pivot xml (count() for deptno in (select deptno from scott.dept));

然而,当写完上面PIVOT XML滴时候,使用Java读取数据时,却发现读取不了PIVOT XML的CLOB(普通的并且数据相同的CLOB却能正常读取)

努力了几天,亦尝试下载目前最新的OJDBC,但仍然报错。Oracle中“行转列”的实现方式

报错为

  • “Invalid column type: getCLOB not implemented for class oracle.jdbc.driver.T4CNamedTypeAccessor”--ojdbc6.jar

原文地址:http://www.cnblogs.com/nick-huang/p/3836061.html

Oracle中“行转列”的实现方式的更多相关文章

  1. Oracle中"行转列"的实现方式

    在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用"行转列": scott的emp的原始数据为: ...

  2. 面试题:oracle数据库行转列的问题

    今天我一个学弟问了一个面试题: 有表A,结构如下:A: p_ID p_Num s_id1 10 011 12 022 8 013 11 013 8 03其中:p_ID为产品ID,p_Num为产品库存量 ...

  3. oracle中的rowid--伪列-删除表中的重复内容-实用

    1.rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行. 2.rowid是存储在索引中的一组既定的值(当行确定后).我们可以像表中普通的列一样将它选出来. 3 ...

  4. Oracle中ROWNUM伪列和ROWID伪列的用法与区别

    做过Oracle分页的人都知道由于Oracle中没有像MySql中limit函数以及SQLServer中的top关键字等,所以只能通过伪列的方式去满足分页功能,在此,不谈分页方法,只从根本上去介绍这两 ...

  5. Oracle实现行转列+Mybatis

    1.需求 报表需要动态展示某几个公司分别在几个月内销售额情况(前端表头月份是动态的,月时间段是前端参数来选择的,最大为12个月), 页面展示如下 Oracle数据库中数据如下: 可以看到一个公司的月份 ...

  6. Oracle 中的伪列

    昨天做了一个Oracle PL/SQL 相关的测试,其中有一道这样的题目:   下列那些是Oracle的伪列(ACD)  A.ROWID   B.ROW_NUMBER()  C.LEVEL  D.RO ...

  7. Oracle中的伪列

    分页查询中,需要用到伪列rownum,代码如下: select * from (select rownum rn, name from cost where rownum <= 6) where ...

  8. Oracle学习总结(4)——MySql、SqlServer、Oracle数据库行转列大全

    MySql行转列 以id分组,把name字段的值打印在一行,逗号分隔(默认) select CustomerDrugCode,group_concat(AuditItemName) from noau ...

  9. oracle 11g行转列 列转行

    行转列: SELECT *   FROM   src_table   UNPIVOT (param_value FOR param_name IN (product_color AS 'product ...

随机推荐

  1. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  2. [转]C++中四种类型转换符的总结

    C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression)    reinterpret_cast操 ...

  3. rman

    http://wenku.baidu.com/link?url=UGVBgYKaKoT7_KI-jpj3BG0XF_7_kpZBZLoXD-9uTQkpw-brlacrkVNcfkHEXuax4ahc ...

  4. 【hiho一下第77周】递归-减而治之 (MS面试题:Koch Snowflake)

    本题是一道微软面试题,看起来复杂,解出来会发现其实是一个很简单的递归问题,但是这道题的递归思路是很值得我们反复推敲的. 原题为hihocoder第77周的题目. 描述 Koch Snowflake i ...

  5. Java for LintCode 链表插入排序

    用插入排序对链表排序 解题思路: 最省时间的方法是使用优先级队列,但是无法通过,那就直接插入排序好了. public ListNode insertionSortList(ListNode head) ...

  6. 3.SpringMVC修改配置文件路径和给界面传递数据

    1.修改配置文件路径  达到  配置多文件的目的 web.xml文件中基础配置有springMVC配置的servlet路径 <servlet-name>SpringMVC</serv ...

  7. [ 转]Collections.unmodifiableList方法的使用与场景

    在公司接触到Collections.unmodifiableList(List<? extends T> list)) 觉得用法挺特殊的,所以学习了下,简单而言,看名字就知道,将参数中的L ...

  8. KMP单模快速字符串匹配算法

    KMP算法是由Knuth,Morris,Pratt共同提出的算法,专门用来解决模式串的匹配,无论目标序列和模式串是什么样子的,都可以在线性时间内完成,而且也不会发生退化,是一个非常优秀的算法,时间复杂 ...

  9. sqlserver 动态行转列

    DECLARE @SQL VARCHAR(8000)SET @SQL = 'select overcode 'SELECT @SQL = @SQL + ' , max(case header when ...

  10. 【XLL 框架库函数】 Excel/Excel12f

    Excel/Excel12f 这两个库函数分别包装了 C API 中的 Excel4 和 Excel12 函数,它们会检查函数没有参数时是否为零,它将表明创建临时的 XLOPER 或 XLOPER12 ...