oracle中的行列转换(一 列转行 pivot)
来源:互联网 发布:java面试项目介绍范文 编辑:程序博客网 时间:2024/05/17 03:33
在实际统计中,我们可能需要对统计的数据进行行列转换以达到我们想要的更便于分析查看对比的格式。例如:我们想要统计在一段时间(过去一年或一个月)所有客户在24小时的消费情况。对于结果我们更愿意让一行记录标识一个客户的24小时消费情况。下面我以oracle中的emp表为例,使用pivot列转行达到我们想要的效果。
select deptno, empjob, sum(sal) from emp group by deptno, empjob order by deptno, empjob
结果如下:
显然这样的结果并不便于我们观察各部门各职位的总薪资。我们可以使用pivot来实现:
select * from (select deptno, empjob, sal from emp) pivot( sum(sal) for empjob in ( 'PRESIDENT' as PRESIDENT, 'MANAGER' as MANAGER, 'ANALYST' as ANALYST, 'CLERK' as CLERK, 'SALESMAN' as SALESMAN ) ) order by deptno;
结果如下:
我们可能不想自己手工输入empjob对应的值,可以使用plsql解决这个问题。
declare str1 varchar2(200); str2 varchar2(500);beginselect LISTAGG( empjob,''',''') within group (order by empjob) as str into str1 from (select empjob from emp group by empjob);STR1 := ' '' '||str1 ||' '' ';str2 := 'select * from (select deptno, empjob, sal from emp) pivot( sum(sal) for empjob in ( '||str1||' ) ) order by deptno';DBMS_OUTPUT.PUT_LINE('str1:'||str1);DBMS_OUTPUT.PUT_LINE('str2'||str2);end;
输出结果为:
str1:' ANALYST','CLERK','MANAGER','PRESIDENT','SALESMAN ' str2:select * from (select deptno, empjob, sal from emp)pivot( sum(sal) for empjob in ( 'ANALYST','CLERK','MANAGER','PRESIDENT','SALESMAN' ) ) order by deptno
注意:
str2执行后查询到的结果:
注意:类名称可能并不是我们期望的,注意修改列名称。
这时候我们就可以根据业务逻辑需求修改plsql或者存储过程等,创建相应的表或者视图,将查询到的数据放到表或视图,方便我们以后使用。
上面的例子是只有sum(sal)
这一列的值,现在我们要解决的问题是:汇总各部门各职位的薪资总和和职员人数。
select * from (select deptno, empjob, sal from emp)pivot( sum(sal) as sal_sum, count(sal) as num for empjob in ( 'PRESIDENT' as PRESIDENT, 'MANAGER' as MANAGER, 'ANALYST' as ANALYST, 'CLERK' as CLERK, 'SALESMAN' as SALESMAN ) ) order by deptno
结果如下:
0 0
- oracle中的行列转换(一 列转行 pivot)
- SQL中PIVOT 行列转换;UNPIVOT列转行
- 行列转换(列转行)
- SQL Server 2005之PIVOT/UNPIVOT行列转换(行转列、列转行)
- 列转行-行列转换
- oracle 行列转换 pivot
- Oracle 11g pivot列转行
- SQL 列转行问题。普通行列转换。
- sqlserver2008 PIVOT列转行
- Pivot 多列转行
- pivot实现列转行
- Oracle 11g Pivot函数实现列转行
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
- Oracle列转行函数Listagg以及pivot查询示例
- Oracle 11g Pivot函数实现列转行
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
- oracle nupivot函数实现行转列和pivot实现列转行
- SQL 2008行列转换的pivot--产生动态列
- OpenvSwitch系列之flow_mod
- ubuntu配置swoole开发环境
- DispatcherServlet与ContextLoaderListener的对比
- 在sqlserver中查询注释的函数
- java web QQ(六)
- oracle中的行列转换(一 列转行 pivot)
- 数据库设计三大范式
- Java多线程模拟实现消费者生产者问题
- 游戏开发 博客
- 安装、使用maven的一系列博客
- vb
- LESS简介及使用方法
- Jenkins——应用篇——插件使用——Publish over SSH
- C++继承时派生类的成员访问属性