Oracle中“行转列”的实现方式
在报表的开发当中,难免会遇到行转列的问题。
以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中“行转列”的实现方式的更多相关文章
- Oracle中"行转列"的实现方式
在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用"行转列": scott的emp的原始数据为: ...
- 面试题:oracle数据库行转列的问题
今天我一个学弟问了一个面试题: 有表A,结构如下:A: p_ID p_Num s_id1 10 011 12 022 8 013 11 013 8 03其中:p_ID为产品ID,p_Num为产品库存量 ...
- oracle中的rowid--伪列-删除表中的重复内容-实用
1.rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行. 2.rowid是存储在索引中的一组既定的值(当行确定后).我们可以像表中普通的列一样将它选出来. 3 ...
- Oracle中ROWNUM伪列和ROWID伪列的用法与区别
做过Oracle分页的人都知道由于Oracle中没有像MySql中limit函数以及SQLServer中的top关键字等,所以只能通过伪列的方式去满足分页功能,在此,不谈分页方法,只从根本上去介绍这两 ...
- Oracle实现行转列+Mybatis
1.需求 报表需要动态展示某几个公司分别在几个月内销售额情况(前端表头月份是动态的,月时间段是前端参数来选择的,最大为12个月), 页面展示如下 Oracle数据库中数据如下: 可以看到一个公司的月份 ...
- Oracle 中的伪列
昨天做了一个Oracle PL/SQL 相关的测试,其中有一道这样的题目: 下列那些是Oracle的伪列(ACD) A.ROWID B.ROW_NUMBER() C.LEVEL D.RO ...
- Oracle中的伪列
分页查询中,需要用到伪列rownum,代码如下: select * from (select rownum rn, name from cost where rownum <= 6) where ...
- Oracle学习总结(4)——MySql、SqlServer、Oracle数据库行转列大全
MySql行转列 以id分组,把name字段的值打印在一行,逗号分隔(默认) select CustomerDrugCode,group_concat(AuditItemName) from noau ...
- oracle 11g行转列 列转行
行转列: SELECT * FROM src_table UNPIVOT (param_value FOR param_name IN (product_color AS 'product ...
随机推荐
- Calendar类测试
public static void main(String[] args) throws ParseException { // 字符串转换日期格式 // DateFormat fmtDateTim ...
- centos6.5 tomcat开机启动
可参考:centos6.5 nginx开机启动 /etc/init.d/下添加tomcatd文件,内容如下: #!/bin/sh # # chkconfig: - # # Licensed to th ...
- response content-type json
2015年11月3日 15:47:43 百度知道:ajax开发中在请求服务器端的响应时, 对于每一种返回类型 规范的做法是要在服务端指定response的contentType 常遇到下面的几种情况: ...
- ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)
这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...
- Thread.Sleep in WinRT
Thread.Sleep in WinRT static void Sleep(int ms) { new System.Threading.ManualResetEvent(false).Wa ...
- 【Android】如何将eclipse工程导入studio
1.eclipse工程右键->export->Generate Gradle build files 2.studio->New->import project->选择工 ...
- centos搭建svn服务器并在windows实验
安装步骤如下: 1.yum install subversion 2.输入rpm -ql subversion查看安装位置,如下图: 我们知道svn在bin目录下生成了几个二进制文件. 输入 ...
- js中 map 遍历数组
map 方法会迭代数组中的每一个元素,并根据回调函数来处理每一个元素,最后返回一个新数组.注意,这个方法不会改变原始数组. 在我们的例子中,回调函数只有一个参数,即数组中元素的值 (val 参数) , ...
- win7下安装openpyxl
想使用python来操作Excel,看资料据说openpyxl非常好用,于是到https://pypi.python.org/pypi/openpyxl下载了安装包.下面就来说说安装步骤,也算是对自己 ...
- [Android Pro] Android 性能分析工具dumpsys的使用
reference to : http://www.open-open.com/lib/view/open1405061994872.html Android提供的dumpsys工具可以用于查看感兴趣 ...