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

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

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

scott的emp的原始数据为:

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

一、经典的实现方式

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

select t.job, count(decode(t.deptno, ‘10‘, 1)) as "10(DEPTNO)",
       count(decode(t.deptno, ‘20‘, 1)) as "20(DEPTNO)",
       count(decode(t.deptno, ‘30‘, 1)) as "30(DEPTNO)",
       count(decode(t.deptno, ‘40‘, 1)) 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(1) for deptno in (10, 20, 30, 40));

三、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(1) for deptno in (select deptno from scott.dept));

本文转自:http://www.cnblogs.com/nick-huang/p/3836061.html

时间: 2024-08-06 19:50:28

Oracle中"行转列"的实现方式的相关文章

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

oracle的行转列和列转行

1.行转列: 一.最初的数据: 转换之后的数据: 二.转换的语句: --统计各职位的人员在各部门的分布人数:SELECT T.JOB, SUM(DECODE(T.JOB, 'CLERK', 1, NULL)) AS COUNT1 , SUM(DECODE(T.JOB, 'SALESMAN', 1, NULL)) AS COUNT2 , SUM(DECODE(T.JOB, 'PRESIDENT', 1, NULL)) AS COUNT3 , SUM(DECODE(T.JOB, 'MANAGER',

Oracle中的伪列

分页查询中,需要用到伪列rownum,代码如下: select * from (select rownum rn, name from cost where rownum <= 6) where rn >3; 可是第一次用rownum,第二次用rn,位置不能变,否则出错,第一次的rownum是oracle中的一个虚拟列,rn是给这个rownum起的别名,也就是在子查询中的别名要在外查询中调用. 如果先按工资排序,再取出6到10号,可以写成: select * from (select rown

Oracle数据 行转列

记录一段行转列SQL代码: select cs.standard_id,cs.area_code,cs.exu_dept, regexp_substr(exu_dept, '[^,]+', 1, level) as dept_id from ca_stand_exu_dept cs connect by id = prior id and instr(exu_dept||',', ',', 1, level) > 0 and prior dbms_random.value is not null

Oracle自定义行转列函数

--行转列自定义函数,只针对TABLE1表 --paramType是参数类型,用于判断,param1和param2是条件参数 create or replace function My_concat(paramType in integer,param1 in varchar2,param2 in varchar2) return varchar2 is resultStr varchar2(2000); begin if paramType = 1 then --定义游标 for temp_c

oracle 中根据某些列合并值

比如列一为 A1,B1,C1 第二列为   A1,B1, C2 合并为A1 B1 C1,C2 select columnName1,columnName2,columnName3, wm_concat(columnName4) from tableName group by columnName1,columnName2,columnName3

MySQL中模拟oracle中的rownum列

mysql> select @rn := @rn + 1 as rownum, emp_no, dept_no, from_date, to_date -> from dept_emp, (select @rn := 0) a limit 20; +--------+--------+---------+------------+------------+ | rownum | emp_no | dept_no | from_date | to_date | +--------+-------

浅谈oracle中rowid和rownum

[ 概要 ] 刚刚接触oracle的同学可能常常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有很大的帮助, 下面偶就抛砖引玉, 简单地谈谈他们之间的区别吧. [ 比较 ] rowid和rownum都是oracle中的伪列, 但他们还是存在本质区别: rowid: 是物理地址, 用于定位数据表中数据的位置, 它是唯一的且不会改变. rownum: 是根据查询的结果集给每行分配的一个逻辑编号, 查询结果不同, rownum自然不同. 对于同一条记录, 查询条件不同,

(转)Oracle中的rownum,ROWID的 用法

场景:在书写oracle的sql语句时候,如果语句不存在主键,需要删除几条重复的记录,这个时候如果不知道oracle中的伪列,就需要把所有的重复记录先删除,再插入.这样做好麻烦,可以通过伪列来定位记录. 1 ROWNUM的使用——TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集).简单的说ROWNUM是符合条件结果的序列号.它总是从1开始排起的