zoukankan      html  css  js  c++  java
  • 【BIEE】04_当维度表中的维不存在事实表中,需要展示所有维度并且数据类展示为0

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

    例如:事实表的数据如下

    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

    真是一路坎坷!

  • 相关阅读:
    NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
    QOpenGLShaderProgram: could not create shader program
    ubuntu loading initial ramdisk 卡住
    ubuntu 下pip install sasl报错fatal error: sasl/sasl.h: No such file or directory
    ImportError: No module named managers
    python docker 多进程提供 稳定tensorflow gpu 线上服务
    侧脸生成正脸概论与精析(一)Global and Local Perception GAN
    pytorch安装 caffe2 安装:git 慢 caffe2 cannot find -lopencv_dep_cudart ,undefined reference to 'pthread_create'
    undefined symbol: PyFPE_jbuf
    Metasploit后渗透模块开发
  • 原文地址:https://www.cnblogs.com/OliverQin/p/8324865.html
Copyright © 2011-2022 走看看