报表和数据仓库运算

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 ‘20‘ 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 ‘00‘ then ‘gdepjob‘
          when ‘10‘ then ‘gdep‘
          when ‘01‘ then ‘gjob‘
          when ‘11‘ 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;
时间: 2024-09-30 18:48:58

报表和数据仓库运算的相关文章

Oracle查询优化改写--------------------报表和数据仓库运算

一.行转列 二.列传行 ' 原文地址:https://www.cnblogs.com/hanxue112253/p/8177390.html

【书评:Oracle查询优化改写】第五至十三章

[书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 字符串的处理 ② 常用分析函数 ③ 用sql输出九九乘法表 本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 一.2.2  实验环境介绍 oracle 11g 一.2.3  相关参考文章链接 前4章的链接参考相关连接:

报表分片运算调度控制台

CREATE OR REPLACE PACKAGE qms_rpt_operating_station_pub AS /****************************************************************************** NAME: qms_rpt_operating_station_pub PURPOSE: 报表分片运算调度控制台 REVISIONS: Ver Date Author Description --------- -----

数据仓库基础介绍

前言 本文将会讲述 BI/DW/DA 领域的一些常见概念,如:事实表.维度表.建模.多维分析.cube 等,但不涉及具体实例分析. 1.维(Dimension) 维是用于从不同角度描述事物特征的,一般维都会有多层(Level:级别),每个Level都会包含一些共有的或特有的属性(Attribute),可以用下图来展示下维的结构和组成: 以时间维为例,时间维一般会包含年.季.月.日这几个Level,每个Level一般都会有ID.NAME.DESCRIPTION这几个公共属性,这几个公共属性不仅适用

润乾报表的组成和变迁

产品发展 润乾公司在润乾报表3.x中首次应用了非线性报表模型,并在该版本的实践过程中积累了丰富的工程化经验.在这些基础上开发出的润乾报表5.x,实现了理论模型和工程实践的完美结合,不仅保持原有的开发高效性,运算性能指标也有了大幅度提高,成为一款经典的报表工具软件. 产品在应用过程中不断有新的需求加入,而且在完善过程中也难以对仍在快速积累中的需求进行深入梳理,润乾报表5.x逐步发展成融合了固定报表.自助报表和填写表单这三项主要功能的庞大体系. 随着应用经验的进一步丰富,我们逐渐意识到,报表工具的这

用润乾集算报表实现实时报表(T+0)的方案

在报表项目中,客户越来越关注源数据的实时性,希望看到最新发生的数据在报表中体现出来.但是,传统的报表工具+数据仓库+ETL方式很难做到这一点,往往是只能看到昨天.上周甚至是上个月的情况,也就是T+1.T+7.T+30统称T+n报表.很难实现T+0报表,也就是能体现实时信息的报表. 分析其原因在于:1.如果报表的历史数据和最新数据都从客户的生产系统读取,虽然可以实现T+0报表,但是会对生产数据库造成压力,影响客户的业务.2.如果采用数据仓库的方式,那么ETL从生产库中取出数据,需要较长的"窗口时间

有赞大数据实践: 敏捷型数据仓库的构建及其应用

有赞大数据实践: 敏捷型数据仓库的构建及其应用 有赞大数据实践: 敏捷型数据平台的构建及其应用 前言 数据仓库设计 总体架构 数据仓库实例 基础指标层 分层的好处 数仓工具 数据仓库与数据分析 即席查询系统 多维分析系统 搜索分析系统 固定报表系统 数据仓库在信息检索中的应用 小结 前言 互联网公司一般发展迅速. 一方面, 业务飞速发展, 当前应用的形式和模型每天都在变化; 企业的产品也在经历不断的下线上线过程. 数据仓库如何拥抱变化, 是难点之一. 互联网的运营人员从了解经营状况转化为精细化运

润乾集算报表优化应用结构之实现T+0实时报表

在报表项目中,客户越来越关注源数据的实时性,希望看到最新发生的数据在报表中体现出来.但是,传统的报表工具+数据仓库+ETL方式很难做到这一点,往往是只能看到昨天.上周甚至是上个月的情况,也就是T+1.T+7.T+30统称T+n报表.很难实现T+0报表,也就是能体现实时信息的报表. 分析其原因在于:1.如果报表的历史数据和最新数据都从客户的生产系统读取,虽然可以实现T+0报表,但是会对生产数据库造成压力,影响客户的业务.2.如果采用数据仓库的方式,那么ETL从生产库中取出数据,需要较长的"窗口时间

数据仓库基础术语名词一览

冰山查询――iceberg query 在数据仓库领域有一个概念叫Iceberg query,中文一般翻译为"冰山查询".冰山查询在一个属性或属性集上计算一个聚集函数,以找出大于某个指定阈值的聚集值. 以销售数据为例,你想产生这样的一个顾客-商品对的列表,这些顾客购买商品的数量达到3件或更多.这可以用下面的冰山查询表示: Select        P.cust_ID, P.item_ID, SUM(P.qty) From           Purchase P Group by