Oracle Sql优化之报表和数据仓库运算
1.行转列:有两种写法,一种是case when end写法,另一种写法是pivot(oracle 11g新增)
select job,
sum(case deptno when 10 then sal end) as sal10,
sum(case deptno when 20 then sal end) as sal20,
sum(case deptno when 30 then sal end) as sal30,
sum(sal) as allsal
from emp
group by job
order by 1;
select *
from (select job,sal,deptno from emp)
pivot(sum(sal) as s for deptno in(10 as d10,20,30 as d30))
order by 1;
pivot的维护比case when end简洁,当增加一个统计属性时,只需增加一个sum函数。
pivot一次只能实现一个属性的行专列,多个属性的行转列只能采用case when end
执行计划:pivot在执行时,还是被翻译成了case when end.
2.列转行:有两种写法,一种是union all,另一种是unpivot分析函数
select ‘10’ as deptno, deptno_10_ct as rc from test
union all
select '' as deptno, deptno_20_ct as rc from test
select * from test
unpivot (rc for deptno in(deptno_10_ct,deptno_20_ct));
union all 的执行计划显示需要两次全表扫描,而unpivot则只需一次
当同时需要对两种属性进行转置时,可以进行如下处理
select deptno,rc.sal
from test
unpivot include null(rc for deptno in(deptno_10_ct as 10,deptno_20_ct as 20))
unpivot include null(sal for deptno1 in(deptno_10_s as 10,deptno_20_s as 20))
where deptno =deptno1;
需要注意:unpivot转置的列属性要一致;include null是当遇到空值时也转置,xxx for col in 默认所有列。
2.分组显示中,抑制重复值的显示
select case when lag(job) over(order by job,ename)=job then null else job end as fjob,ename as fename
from emp1
where deptno=20
order by job,ename
注意order by优先使用select 中别名.
3.ntile函数,对数据按照指定数量进行分组优化
select ntile(3) over(order by empno) as g,empno,ename,job
from emp
where job in ('MANAGER','CLERK');
4.分组求和:按照某一属性或多个属性,分组求和之后,如何把求和的结果求一个总计
select deptno,job,sum(sal)
from emp
group by rollup((deptno,job));
采用group by的一个扩展 rollup函数。
区分返回结果中哪些是小计,哪些是总计
select case grouping(deptno) when 1 then '总计' else to_char(deptno) end as code,
case when grouping(deptno)=1 then null when grouping(job)=1 then '小计' else job end as gz,
case when grouping(job)=1 then null when grouping(mgr)=1 then '小小计' else to_char(mgr) end as mmgr,
max(case when empno in(7788,7654,7902) then empno end) as max_empno,
sum(sal) as salsum
from emp1
group by rollup((deptno,job,mgr));
分组后,实现数据的立方上下钻取,可以采用cube分析函数,也是group by的一个扩充
select case grouping(deptno)|| grouping(job)
when '' then 'gdepjob'
when '' then 'gdep'
when '' then 'gjob'
when '' then 'gall' end as gelem,
deptno,job,sum(sal) as allsal
from emp
group by cube(deptno,job)
order by grouping(job) desc,grouping(deptno)desc, deptno asc;
5.分析函数的,开窗的识别,range,row的区别
select ename,sal,
sum(sal) over(order by sal) as sal1,
sum(sal) over(order by sal range between unbounded preceding and current row) as sal2,
sum(sal) over(order by sal rows between unbounded preceding and current row) as sal3,
sum(sal) over() as sal4,
sum(sal) over(order by sal range between unbounded preceding and unbounded following) as sal5,
sum(sal) over(order by sal rows between unbounded preceding and unbounded following) as sal6
from emp
where deptno =30;
6.listagg分类汇总
with l as
(select level as lv from dual connect by level<=9),
m as
(select a.lv as alv,b.lv as blv,
to_char(b.lv)|| 'x'|| to_char(a.lv)||' = '|| rpad(to_char(a.lv*b.lv),2,' ') as text
from l a,l b
where b.lv<=a.lv)
select listagg(m.text,' ') within GROUP(order by m.blv) as 小九九
from m
group by m.alv;
Oracle Sql优化之报表和数据仓库运算的更多相关文章
- Oracle SQL优化[转]
Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...
- oracle sql 优化大全
转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...
- Oracle SQL 优化原则(实用篇)
由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...
- oracle sql优化
整理一下网上所看到sql优化方法 1.使用大写字母书写sql,因为oracle解释器会先将sql语句转换成大写后再解释 2 减少访问数据库的次数,多数情况下一条sql可以达到目的的,就不要使用多 ...
- Oracle SQL优化一(常见方法)
1.表访问方式优化: a)普通表优先“Index Lookup 索引扫描”,避免全表扫描 大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表 ...
- Oracle SQL 优化规则
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
- Oracle SQL优化进阶学习
引言 对于下面的Oracle分页如何优化该段语句: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM task_log order by ...
- oracle sql优化笔记
oracle优化一般分为:1.sql优化(现在oracle都会根据sql语句先进行必要的优化处理,这种应该用户不大了,但是像关联和嵌套查询肯定是和影响性能的) A.oracle的sql语句的条件是从右 ...
- Oracle SQL优化器简介
目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...
随机推荐
- iOS 数组字典操作
iOS开发中需要大量对dictionary和array进行操作,因此我们需要一种更加安全可靠的操作方法来避免不必要的crash.当然可以通过自定义dictionary 和array重载增删改查的方法来 ...
- HTML URL编码参考(转载)
URL编码(URL encoding)的作用是将字符转化为可在因特网上安全传输的格式.URL——统一资源定位符Web浏览器通过URL从Web服务器上请求页面.URL就是网页的地址,如:http://w ...
- Core Animation中的组动画
实际开发中一个物体的运动往往是复合运动,单一属性的运动情况比较少,但恰恰属性动画每次进行动画设置时一次只能设置一个属性进行动画控制(不管是 基础动画还是关键帧动画都是如此),这样一来要做一个复合运动的 ...
- Repeater控件的嵌套使用
1.前台代码: <asp:Repeater ID="OrderList" runat="server" onitemdatabound="Ord ...
- 十二、oracle 数据库(表)的逻辑备份与恢复
一.介绍逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程.逻辑恢复是指当数据库对象被误操作而损坏后使用工具import利用备份的文件把数据对象导入到数据库的过程.物理备份即可在数 ...
- linux命令积累(Ubuntu)
1.查看IP地址 ifconfig 2.退出more 使用ctrl+c 3.vi编辑,删除一行为dd 4.ubuntu安装tftp服务器:http://www.cnblogs.com/geneil/a ...
- 数据查找之80-20原则的JavaScript代码实现
作为前端开发人员,无论在工作还是找工作(笔试/面试),或多或少会涉及一些数据结构的知识. 数据结构即计算机存储和组织数据的方式. 常用的结构:数组.栈.队列.链表.树.图.堆和散列表 关于数据,我们常 ...
- JS获取网页中HTML元素的几种方法分析
getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getEle ...
- JAVA EE 运行环境配置(包含JAVA SE)
JAVA EE 运行环境配置(包含JAVA SE) 1.下载并安装jre-7u7-windows-i586.exe (最新的JAVA运行环境) 2.下载并安装java_ee_sdk-6u4-jdk7- ...
- ORACLE里锁有以下几种模式,v$locked_object,locked_mode【转】
ORACLE里锁有以下几种模式:0:none1:null 空2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive 4: ...