BIEEE 创建多维钻取分析(4)
在上一节时,我们创建了一个基于部门号的工资分类汇总。 这里就引出了一个概念:维度
专业的解释大家自行百度,这里就不班门弄斧了。从数据的使用角度看,维度可以简单的理解成“数据分类汇总的一种依据”。
按“部门号(DEPTNO)”对“工资(SAL)”进行分类汇总,“DEPTNO"就是一种维度;按“工作岗位(JOB)”对“工资”进行分类汇总,“JOB”就是另一种维度;
维度之间也可以有层次关系,比如:我们先按“工作岗位” 汇总,然后每个相同工作岗位的员工,再按“部门”汇总。这种场景下:DeptNo就认为是Job的子级维度。
先按Job汇总数据,相同Job的,再按DeptNo做更详细的数据汇总,这种逐层深入的数据分析过程,在BI层里有一个专业术语:钻取(Drill).
下面就刚才的场景(即:按JOB -> DEPTNO来层层对SAL进行分类汇总),来看看维度如何创建:
一、db表结构的创建
通过上回的学习,大家应该有一个大概印象,每种数据分类的依据,我们应该创建一张小表来与之对应(比如按部门号汇总时,DEPT部门表就认为是一张维度表)
现在我们要通过JOB、DEPTNO 这二个有层级的维度对数据进行分析,所以:得有二张表。
动手之前,插点题外话:通常对数据进行分析比较消耗db性能(特别是复杂的分析),所以一般真正的BI分析,都会事先把数据抽取到另一张表(甚至另一个专用于BI分析的库),这样分析时,不至于影响正常的生产系统使用。
这里我不想对数据抽取展开讨论(事实上,这一块我还没学会~_~),但是为了体现这个思想,我们创建几张以“BI_”为前缀的新表来作为BI分析的数据源。
这样就创建了二张小表BI_DIM_JOB、BI_DIM_DEPT以对应JOB、DEPT二个维度,但通常表还得有主键:
加上主键后,我们再来看下主表EMP,既然JOB、DEPTNO都准备用单独的小表记录,主体表中就不再需要这些字段了,我们只是想对SAL进行分析,所以我们把EMP主表也做下处理:
这样就得到了一张新的(事实)主表,做为BI的事实表数据源。
哦,仔细看了一下:这张表里没有ENAME(员工姓名),干脆,把EMPNO也当成一个维度,独立出来吧:
看到这里,可能已经有人发现了一个重大的问题:主表BI_FACT_EMP与这些小表之间好象没有任何数据上的关联关系?
看来,还少一张用于描述EMPNO与JOB、DEPTNO之间关系的表:
好了,天下太平,主表BI_FACT_EMP 与 从表 BI_DIM_DRILL_EMP 通过EMPNO关联,而 BI_DIM_DRILL_EMP 再进一步通过EMPNO、JOB、DEPTNO分别与BI_DIM_EMP、BI_DIM_JOB、BI_DIM_DEPT关联,完全符合数据库范式。
光看上面的sql脚本,比较容易晕,为了更直观的说明各表的关系,这里给一张关系图:
二、创建RPD 模型及维度
2.1、 先用“BI管理”工具,联机打开当前RPD,并把原来的对象全清空掉,再按前几次学到的知识,把刚刚新创建的"BI_"打头的表,全添加进来,弄好后,大概是下面这个样子
注意图中二个黄色的字段:SAL_SUM、EMPNO_COUNT,这是我手动新添加的二个聚合字段,SAL_SUM是对SAL的SUM聚合,而EMPNO_COUNT是对EMPNO的COUNT聚合,参见下图:
2.2、 在scott上右击->新建对象-》逻辑维-》具有基于级别的层次的维
在弹出的界面中,输入名称:BI_EMP_DIMs
然后在BI_EMP_DIMs上右击-》新建对象->逻辑级别
输入EMPNO(即创建最底层的维度)
然后把BI_DIM_DRILL_EMP下的EMPNO拖动到刚创建的维度EMPNO下,如下图:
完成后,类似下图:
在EMPNO维度上右击-》新建对象-》父级别
命名为DEPTNO
完成后,可以看到DEPTNO与EMPNO已经呈现出父子层次关系
同样,把BI_DIM_DRILL_EMP中的DEPTNO拖动刚创建的维度DEPTNO上,如下图:
在DEPTNO维度上,再继续创建父级维度JOB
同样把BI_DIM_DRILL_EMP上的JOB拖动到新创建的维度JOB上,最终的维度层次如下图:
2.3、创建维度关键字:在JOB上右击->新建逻辑级别关键字(如下图)
保存默认,不作任何修改,直接点击“确定”
类似的,在DEPTNO,EMPNO二个子级维度上,也创建关键字,然后点击保存,最终的样子如下图:
注:保存成功后,每个维度下的字段前,会有一个类似“手*枪”的小图标
2.4、把整个维度BI_EMP_DIMs拖动到【表示】层中的BI_FACT_EMP上,如下图:
如果这时点击保存,会弹出如下错误:
解决方法:在EMPNO上右击-》属性(如下图)
点击+号
在弹出的界面中,展开SCOTT下的BI_DIM_DRILL_EMP表,双击EMPNO(即设置BI_DIM_DRILL_EMP的EMPNO字段为维度EMPNO的显示列)
类似的,把BI_DIM_DRILL_EMP的DEPTNO设置成维度DEPTNO的显示列,把BI_DIM_DRILL_EMP的JOB设置成维度JOB的显示列,再次点击保存,应该就能成功了。
模型和维度终于弄好了,已经成功80%,革命胜利在望!
三、创建钻取分析
登录,切换到管理菜单,点击“重新加载文件和元数据”,以便让刚才修改过的RPD生效
创建一个分析,从左侧的主题区域里,可以看到刚才创建的各种模型,我们选JOB和SAL_SUM、EMPNO_COUNT这三列,如下图:
切换到结果标签,如下图,注意JOB列标题及该列数据,都以A链接的形式呈现,为了方便以后修改,这里我们先保存一下,文件命名为SCOTT_EMP_DRILL,同时点击工具栏的小图标(如下图),预览下在仪表盘中的效果
这是仪表盘中的呈现效果,可以在JOB标题上点击一下
这里,BIEE会根据维度的层次关系,自动“下钻”到下一个维度(即DEPTNO),如下图:
DEPTNO维度下,还有最底层维度EMPNO,还可以继续下钻,如下图(注意一下每次钻取后,SAL_SUM、EMPNO_COUNT这二列的值会自动更新)
当然,维度不止这一种玩法,还可以直接把整个维度放到分析结果中,如下图,如果双击BI_EMP_DIMs把整个维度加入所选列
为了美观,我们把列名“汉化”一下
把列标题改成“工资”,其它几列也类似处理
现在看起来舒服多了
可以点击分组数据前的+号展开,这样就以另一种类似树状的方式进行钻取了
最后,为了让分析结果看起来更fashion一点,给它加个动态图表。不过做这个之前,有一个细节得先处理一下,“人数(EMPNO_COUNT)”是“个位数”级别的(<10),而“工资汇总(SAL_SUM)”是“千位数”级别的,如果二个条形柱显示在同一张图中,"人数"的柱状图高度几乎接近于0,根本看不出来,所以有必要把“人数”的数值放大一些,以保持跟SAL_SUM接近(至少同一个数量级)
把人数放大1000位以后,结果看上去还比较满意
下面是钻取过程中,图表动态变化的几张截图:
下钻到DEPTNO维度时的截图
下钻到最底层EMPNO时的截图
截了近一天的图,总算写完了,希望对于正在学习oracle BIEE的朋友们有所帮助
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
BIEEE 创建多维钻取分析(4)的更多相关文章
- Python创建二维列表的正确姿势
Python创建二维列表的正确姿势 简介 Python中没有数组,使用list结构代替,并且list结构的功能更加强大: 支持动态扩容,无需担心元素过量 对list内的元素类型不做一致性约束 提供丰富 ...
- SPSS数据分析—多维偏好分析(MPA)
之前的主成分分析和因子分析中,收集的变量数据都是连续型数值,但有时会碰到分类数据的情况,我们知道最优尺度变换可以对分类变量进行量化处理,如果将这一方法和主成分分析相结合,就称为了基于最优尺度变换的主成 ...
- SPSS数据分析—多维尺度分析
在市场研究中,有一种分析是研究消费者态度或偏好,收集的数据是某些对象的评分数据,这些评分数据可以看做是对象间相似性或差异性的表现,也就是一种距离,距离近的差异性小,距离远的差异性大.而我们的分析目的也 ...
- ios创建二维码
#import "LCTwoCodeImage.h" @implementation LCTwoCodeImage +(UIImage *) GotoCreatMyTwoCode ...
- 动态创建二维vector数组 C和C++ 及指针与引用的区别
二维vectorvector<vector <int> > ivec(m ,vector<int>(n)); //m*n的二维vector 动态创建m*n的二 ...
- iOS原生CIFilter创建二维码
iOS原生CIFilter创建二维码 2016-05-31 未来C iOS原生CIFilter创建二维码 关于二维码生成,网上也是有很多,很早以前的第三方库大多数都是通过C++写,也是有的如zxing ...
- C语言 动态创建二维数组
/*C语言 如何动态创建二维数组 转化为一维数组申请数组,创建和释放都比较简单 */ #include <stdlib.h> #include <stdio.h> #inclu ...
- Python创建二维数组(关于list的一个小坑)
0.目录 1.遇到的问题 2.创建二维数组的办法 3.1 直接创建法 3.2 列表生成式法 3.3 使用模块numpy创建 1.遇到的问题 今天写Python代码的时候遇到了一个大坑,差点就耽误我交作 ...
- c/c++ 图的创建(二维数组法)
c/c++ 图的创建(二维数组法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点,和节点之 ...
随机推荐
- Unity 2D Touch Movement
Demo试玩(Kongregate既然也有广告时间了 --!)http://www.kongregate.com/games/zhaoqingqing/2d-touch-movement 操作步骤 1 ...
- LoadRunner参数化MySQL
准备:安装[msql-ODBC驱动] 一.配置数据源 1.Win7,打开控制面板-系统和安全-管理工具,点击“数据源(ODBC)”. 打开数据源(ODBC),在用户DSN选项卡中点击“添加”按钮,弹出 ...
- 单机最大tcp连接数
from:http://www.cnblogs.com/mydomain/archive/2013/05/27/3100835.html 单机最大tcp连接数 网络编程 在tcp应用中,server事 ...
- docker中清理冗余的image,container
1) 首先进入超级用户模式 [root@docker ~]# sudo su2) 删除container ( container运行时是不能删除的 )首先停止container [root@docke ...
- 房产企业如何借助K2 BPM脱颖而出?
点击这里,查看完整版房地产行业的流程管理解决方案.
- [py] 导入模块 reload(sys)
#!/usr/bin/env python # coding: utf-8 import sys reload(sys) #<------这个是什么意思 sys.setdefault ...
- MySQL基础 - mysql命令行客户端
在Linux系统当中,mysql作为一个客户端命令程序,在很大程度上连接数据库都是使用mysql,因此很有必要熟悉mysql命令行的使用. 这里假设数据库用户为icebug,密码为icebug_pas ...
- Easyui Combotree问题及其相关
Easyui的setValue方法无效 今天在开发项目的时候,遇到第一个很奇怪的问题:EasyUI的setValue方法无效. $('#department_parent').combotree('s ...
- 使用Windows Live Writer发布日志
前言 Windows Live Writer是非常不错的一个日志发布工具,支持本地写文章,然后通过点击一个按钮就发布到网站上,如果借助插件,还可以同时发布到多个博客网站,功能非常强大,很多博友认识她之 ...
- IOS开发之—— UITextView禁止Emoji输入
UITextView代理方法:判断 -(void)textViewDidEndEditing:(UITextView *)textView{ if ([self stringContai ...