【BIEE】04_当维度表中的维不存在事实表中,需要展示所有维度并且数据类展示为0

摘要:
DIM_ LEVEL是维度表的预期效果:①优秀、良好,且总体上排列有序;②当事实表没有[General]级别的数据记录并且相应的值为0时,环境准备首先在数据库中创建事实表和维度表——创建一个新的维度表DROPTABLEDIM_level;CREATETABLEDIM_LEVEL(ELEVELVARCHAR(2)NOTNULL),并建立相应的连接和逻辑列。以下是为按顺序显示上述环境而构建的数据库的屏幕截图。

有时候,我们往往会存在这样的需求

例如:事实表的数据如下

image

EMP_FACT表示事实表,DIM_LEVEL是维度表

预期效果:(根据员工信息,分析各等级员工工资与员工个数)

image

我们在BIEE报表中新建报表,然后展示报表,展示结果如下:

图1

image

那么这个效果跟我们的预期效果可是差别比较大的!我们如何来改变这种差别呢?

首先我们分析上面2个表,我们需要解决2个问题,分别是:

①优秀、良好、一般按照顺序排列

②当事实表不存在【一般】级别数据记录时,展示该维度,并且对应值为0

环境准备

首先在数据库建立事实表与维度表

--新建维度表
  DROP TABLE DIM_LEVEL;
  CREATE TABLE DIM_LEVEL(ELEVEL VARCHAR(2) NOT NULL,
                         LEVEL_DEC VARCHAR(10),
                         DETAIL_DESC VARCHAR(100),
                         PRIMARY KEY (ELEVEL));
  INSERT INTO DIM_LEVEL VALUES ('A', '优秀', '工资大于等于2000');

  INSERT INTO DIM_LEVEL VALUES ('B', '良好', '工资大于等于1500且小于2000');

  INSERT INTO DIM_LEVEL VALUES ('C', '一般', '工资小于1500');
  ------新建表
  DROP TABLE EMP_FACT;
  CREATE TABLE EMP_FACT(CUST_ID VARCHAR(40) NOT NULL ,
                        CUST_NAME VARCHAR(80),
                        SAL INT,
                        ELEVEL VARCHAR(2),
                        PRIMARY KEY (CUST_ID),
                        constraint FK_ELEVEL FOREIGN KEY (ELEVEL) REFERENCES DIM_LEVEL(ELEVEL));
  INSERT INTO EMP_FACT VALUES ('C001', '牧云笙', 6000, 'A');
  INSERT INTO EMP_FACT VALUES ('C002', '牧云勤', 10000, 'A');
  INSERT INTO EMP_FACT VALUES ('C003', '牧云陆', 1700, 'B');
  INSERT INTO EMP_FACT VALUES ('C004', '寒江', 9000, 'A');
  INSERT INTO EMP_FACT VALUES ('C005', '穆如天彤', 10000, 'A');
  COMMIT;

建立好维度之后,导入元数据到资料库中,并且建立相应连接与逻辑列

以下是已经建好的资料库截图

image

按顺序展示

上述环境准备好之后,做出来的报表就是【图1】那个样子了,级别是没有顺序的

现在我们需要按照顺序排序,需要在维度表新增一个排序字段

ALTER TABLE DIM_LEVEL ADD SEQ INT;
UPDATE DIM_LEVEL A SET SEQ=(SELECT CASE WHEN ELEVEL='A' THEN 1 WHEN ELEVEL='B' THEN 2 WHEN ELEVEL='C' THEN 3 ELSE NULL END
FROM DIM_LEVEL B WHERE A.ELEVEL=B.ELEVEL)
COMMIT;

1.将排序字段导入资料库

image

2.拖拽到模型层并且设置【级别描述】字段排序顺序列依赖SEQ

image

记得将字段拖到展现层哦,否则分析中没有SEQ字段!

3.分析中排序,并且隐藏

image

设置列属性

image

点击字段上的image符号,在下拉中选择【排序】→【升序排序】设置SEQ字段为升序,设置完成后会出现如下向上箭头

image

4.查看

image

再次看到的数据就是已经排序了,那这个问题可只是个小插曲,并不是本文的精髓所在,下面所说的才是最主要的问题

展示无事实的维度

我们现在只有优秀,良好两个维度,可能有人在看报表的时候就会存在一个疑问,是不是根本就没统计【一般】这个维度,维度缺失确实很容易造成别人的误解,那么我们就来看看如何让他展示呢?

说说我的基本思路:

使用union将另外一个维度与现存事实合并,即虚拟事实

Let’s do it!

打开已有分析→进入【编辑】状态

image

点击上图的【红色标记】

image

接着点击第一个【标准(”SCOTT”)】,点击旁边的image

image

点击【复制】即可,接着再点击image,点击后,出现【粘贴】

image

点击【粘贴】后,出现三个【标准】,按照下面一个找到未定列的那个【标准】,将其【剪切】

image

【剪切后】就只剩下2个【标准】了

image

此时,将第一个【标准】中的【员工数】、【员工工资】全部置为sum(0)

image

修改完成之后,点击【结果】查看效果

结果很让人失望,报错了:

image

这个是排序问题造成,那么我们将union修改为union all即可解决该问题

image

此时,点击【结果】

image

结果一看,还是不对,级别怎么不排序了!这是由于刚才union结果集时排序自动被取消了!

选中【结果列】,增加升序排序在字段SEQ上

image

高高兴兴的看着等待结果的展示,点击【结果】,请看

image

真是见鬼了,排序了啊,为什么还是这样呢?

看来还有问题,那就继续寻找答案(是不是因为union all造成的呢?是不是两个结果集在一起就不会排序呢?),各种想法浮现出来,但是真正的问题出现在这里:(看下图标记部分)

image

将字段【SEQ】拖拽到【级别】前边,排序竟然成功了!

image

真是一路坎坷!

免责声明:文章转载自《【BIEE】04_当维度表中的维不存在事实表中,需要展示所有维度并且数据类展示为0》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ref:详解MYSQL数据库密码的加密方式及破解方法.NET 5.0实现Consul服务注册下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python 调用百度ORC进行文字识别

最近大神推荐一个新的东西,orc文字识别,是免费的,感觉特别不错,所以打算自己弄来玩玩。 首先要自己上百度申请一个账号https://cloud.baidu.com/product/ocr.html,登陆百度云,然后添加一个应用。创建好应用以后,就跟图片中一样,其中的API KEY 和 Secret Key 要记住,等会调用的时候要用到。 创建好应用以后,首...

iView组件添加API中介绍的事件的方式(render方式添加事件)

iView组件好用,文档齐全,品质可靠稳定。最大的好处是使用了Vue框架,使很多数据绑定和交互问题变的轻松,是难得的开源前端组件。给作者点个赞。用这个组件来学习Vue.js也是不错的选择。 最近用的比较多。碰到的主要问题是绑定事件,试了很多种写法,可能是对vue不太了解,一直没试对。最终发现写法其实很简单。 用现成的组件,比如API里写了一个事件是on-c...

layui模板和jfinal混合使用注意

<!-- 列表信息展示 --> <div class="layui-row"> <table class="layui-table" lay-data="{url:'/student/student/studentCurriculum?id=#(student.id)', page:true,...

JS控制div跳转到指定的位置的解决方案总结

总结一下自己在写这个需求遇到的问题,相信大家应该是经常遇到的。即要求滚轮滚动到指定的位置。先看下基本的解决方案。 1.给链接a加个#的方式来实现跳转。(锚点方法)这里直接贴下代码:    html页面: <div id="container"> <a href="http://t.zoukankan.com/jtjds-...

xios封装

封装的意义 1.提高代码可读性2.提高代码可维护性3.减少代码书写 封装 import axios from 'axios' axios.defaults.baseURL = 'http://127.0.0.1:8000' // 全局设置网络超时 axios.defaults.timeout = 10000; //设置请求头信息 axios.defau...

eventlet的学习

转自:http://bingotree.cn/?p=281 官方网站:http://eventlet.net/ 之前小秦我写了篇python中协程和yield的文章,这里小秦我再总结一下eventlet中比较重要的几个知识点。 1.安装方法: 1 [root@COMPUTE02 ~]# pip install eventlet 2.基础知识及优点 ev...