- 项目描述
项目背景:车险行业中,各地协会按照每月统计本省的新车,非新车,商用车,乘用车的签单保费。
项目需求:根据业务源数据,制作报表展示:
透析表:查看不同公司各年、季度、月的销售额
-
项目框架
- 数据源分析
数据来源:EXCEL表,存储于某个文件夹内
表结构:
数据源描述:EXCEL表中包含多个工作表,每个工作表是河北省的一个市的各保险公司的保费情况,每个EXCEL表名都包含了统计的年份月份。
- DM模型设计
- 物理模型
公司维度(表名称:COMPANY_DIM)
时间维度(DATE_DIM)
车辆用途种类维度(CAR_USED_DIM)
车辆新旧维度(CAR_TYPE_DIM)
地区维度(LOCAL_DIM)
事实表(FACT_PREMIUM)
DM实现
- 创建DM用户以及创建表结构
ORACLE用户名称:auto_insurance_dm
登录SYS用户创建用户并分配权限
CREATE USER auto_insurance_dm IDENTIFIED BY 123456;
GRANT CONNECT,RESOURCE TO auto_insurance_dm;
- 登录创建好的用户
- 创建DM层的表结构
--创建公司维度表
CREATE TABLE COMPANY_DIM(
C_ID NUMBER,
COMPANY_CODE VARCHAR2(50),
COMPANY_NAME VARCHAR2(50),
START_TIME VARCHAR2(50),
END_TIME VARCHAR2(50));
--创建时间维度(DATE_DIM)
CREATE TABLE DATE_DIM(
DATE_VALUE VARCHAR2(50),
DATE_YEAR VARCHAR2(50),
DATE_MONTH VARCHAR2(50),
DATE_QUATER VARCHAR2(50));
--创建车辆用途种类维度(CAR_USED_DIM)
CREATE TABLE CAR_USED_DIM(
C_ID NUMBER,
CAR_USED_CODE VARCHAR2(50),
CAR_USED_NAME VARCHAR2(50),
START_TIME VARCHAR2(50),
END_TIME VARCHAR2(50));
--创建车辆新旧维度(CAR_TYPE_DIM)
CREATE TABLE CAR_TYPE_DIM(
C_ID NUMBER,
CAR_TYPE_CODE VARCHAR2(50),
CAR_TYPE_NAME VARCHAR2(50));
--创建地区维度(LOCAL_DIM)
CREATE TABLE LOCAL_DIM(
C_ID NUMBER,
LOCAL_CODE VARCHAR2(50),
LOCAL_NAME VARCHAR2(50));
--创建事实表(FACT_PREMIUM)
CREATE TABLE FACT_PREMIUM(
C_ID NUMBER,
COMPANY_CODE VARCHAR2(50),
LOCAL_CODE VARCHAR2(50),
CAR_USED_CODE VARCHAR2(50),
CAR_TYPE_CODE VARCHAR2(50),
DATE_VALUE VARCHAR2(50),
F_VALUE NUMBER);
- 公司维度实现
主要思路:
- 数据源选择公司名称,公司编号字段流出,然后按照公司编号排序,去除掉公司编号为空的记录,然后去重;然后使用数据库查询,与目标表对比,筛选掉不需要更新和插入的数据;然后再使用数据库查询,对比,将新记录与需要更新操作的数据分开操作,对新纪录做插入操作,对需要更新的记录做更新操作,并且保留历史记录。
- 采用加时间戳的方式辨别有效记录和历史记录。
源数据操作
为记录排序,主要因为去重操作需要
筛选掉公司编码为空的记录
去除重复
查询数据库,与流中数据做对比,返回对比表中的字段数据
筛选掉不需要更新和插入的记录
选择源数据的字段作为流出数据
将源数据的数据与目标表对比,按照公司编号对比,相同时返回目标表字段有数据,不相同时返回目标表字段为空值。
将数据通过筛选步骤分为两个流,一个为新纪录,一个为更新数据流
新纪录流字段选择,只保留源数据中的字段
获取系统时间
转换系统时间的格式
通过笛卡尔积将每个新纪录关联上一个系统时间,系统时间作为START_TIME
增加一个空值作为END_TIME
调用数据库中的序列
--创建序列
CREATE SEQUENCE COMPANY_SEQ
INCREMENT BY 1 --增长值为1,如果为负数,则是递减
START WITH 1 --从1开始递增
MAXVALUE 9999999 --最大值,MINVALUE为最小值的意思
--NOCYCLE:达到最大值后不循环
--NOCACHE:不对序列进行缓冲
--CACHE:对序列进行缓冲,对序列进行缓冲,可以改善序列的性能
--CYCLE:达到最大值后循环
NOCYCLE NOCACHE;
插入到数据表
以上新纪录的操作完毕,以下是旧数据的更新和历史数据保存操作
在使用筛选记录步骤分拨数据时,字段选择4,为需要做旧数据的更新和历史数据保存操作的流
由于筛选记录步骤只能连接两个步骤,因此字段选择四将流出的所有字段都选择
然后在通过两个字段选择,分别选择对应需要做历史数据保留操作所需的字段,和需要做更新数据操作的字段;历史数据保留操作就是将目标表的END_TIME更新为系统时间;
更新数据直接将数据插入到目标表中并将start_time置为系统时间,end_time为空。
- 日期维度(存储过程)
CREATE OR REPLACE PROCEDURE P_DATE_DIM(
START_DATE IN STRING,
END_DATE IN STRING)
IS
v_date DATE;
v_year VARCHAR2(20);
v_month VARCHAR2(20);
v_quater VARCHAR2(20);
v_count NUMBER;
v_number_month NUMBER;
v_str_date VARCHAR2(20);
BEGIN
SELECT COUNT(*) INTO v_count FROM DATE_DIM;
IF v_count>0
THEN DELETE FROM DATE_DIM;
COMMIT;
END IF;
v_date := TO_DATE(START_DATE,'YYYY-MM');
LOOP
v_year := SUBSTR(TO_CHAR(v_date,'YYYY-MM'),1,4);
v_month :=SUBSTR(TO_CHAR(v_date,'YYYY-MM'),6,2);
v_number_month := TO_NUMBER(v_month);
CASE
WHEN v_number_month >=1 AND v_number_month<=3
THEN v_quater :='第1季度';
WHEN v_number_month >=4 AND v_number_month<=6
THEN v_quater :='第2季度';
WHEN v_number_month >=7 AND v_number_month<=9
THEN v_quater :='第3季度';
WHEN v_number_month >=10 AND v_number_month<=12
THEN v_quater :='第4季度';
END CASE;
v_str_date :=TO_CHAR(v_date,'YYYY-MM');
INSERT INTO DATE_DIM VALUES (v_str_date,v_year,v_month,v_quater);
v_date := ADD_MONTHS(v_date,1);
EXIT WHEN v_date > TO_DATE(END_DATE,'YYYY-MM');
END LOOP;
COMMIT;
END;
--调用存储过程
BEGIN
P_DATE_DIM('1994-01-01', '2030-12-31');
END;
--查看表
SELECT DATE_VALUE,DATE_YEAR,DATE_MONTH,DATE_QUATER FROM DATE_DIM;
- 车辆用途种类维度实现
采用手录的方式实现:
创建序列
CREATE SEQUENCE CAR_USED_SEQ--创建的序列
INCREMENT BY 1 --增长值为1,如果为负数,则是递减
START WITH 1 --从1开始递增
MAXVALUE 100 --最大值,MINVALUE为最小值的意思
NOCYCLE NOCACHE;
向表中插入数据
INSERT INTO CAR_USED_DIM VALUES(CAR_USED_SEQ.NEXTVAL,1001,'商用车',TO_CHAR(SYSDATE,'YYYY-MM-DD'),NULL);
INSERT INTO CAR_USED_DIM VALUES(CAR_USED_SEQ.NEXTVAL,1002,'乘用车',TO_CHAR(SYSDATE,'YYYY-MM-DD'),NULL);
车辆种类(新车/非新车)维度(CAR_TYPE_DIM)
手动插入
SELECT * FROM CAR_TYPE_DIM FOR UPDATE;
- 地区维度(LOCAL_DIM)
主要思路:数据源EXCEL表工作表名称代表河北省的市区,获取工作表名称,添加工作表字段,将地区名称提取出来,然后单独选择出地区名称字段,去重去空值,然后与目标表对比,过滤出新纪录,添加两个序列,一个用作ID,一个用作地区编号,插入到目标表。
获取工作表名称,添加工作表字段
- 事实表(FACT_PREMIUM)实现
EXCEL输入
过滤掉空值
值映射构造时间字段
利用四个字段选择,将流中的结构转换一下
通过MERGE JOIN(一定要记得排序) 与维度表关联将流中的车辆种类、new_type、local_name做关联,然后选择维度表中对应的编码字段
最后添加序列,插入目标表中
创建JOB实现全量加载
在执行转换前将目标表所有数据TEUNCATE
报表展示
- 建立RPD
建立RPD有联机打开和非联机打开
非联机打开:
创建好RPD,或者修改RPD后,每次需要登录http://172.18.48.112:7001/em/,更新RPD到主题区域,否则在创建分析时,看不到创建或修改RPD对应的主题区域
联机打开:
创建创建好RPD,或者修改RPD后,不用登录http://172.18.48.112:7001/em/,更新RPD,直接保存,在创建分析时可以直接看到该RPD对应的主题区域。
流程:物理层–逻辑层–展现层
物理层
创建资料档案库
右击选择物理表图–仅限所选对象
建立物理层外连接:
有两种结构:1.雪花模型
2.星状模型
在这里我们使用星状模型
将事实表与其中一个维度连接到一块
依次类推建立好星状模型
保存。
- 逻辑层
可以删除没有用的字段,进行层次构造,以用于在报表中实现钻取,设计事实表的聚合方式。
对事实表中的值设计聚合方式,双击F_CALUE
建立时间维度钻取,右击创建逻辑维–基于层次级别的逻辑维
然后多了
选中DATE_DIM_DETAIL,右击,新建对象–父级
在MONTH上建立父级QUARTER,然后建立父级YEAR,将字段拉到对应的层次下
创建逻辑关键字
选中,右击,新建逻辑级别关键字–确定,依次建立
展现层
将逻辑层的模型直接拖到展现层,更改展现层的名称,更改图标等。
展现层表重命名:选中表,右击–重命名,修改即可
展现层,字段重命名
双击
修改图标:选中右击–设置图标,选择要使用的图标即可
建立分析
登录http://tom.lan:7001/analytics/saw.dll?bieehome&startPage=1,填写安装时配置的用户名及密码。(注意有些浏览器支持打开,有些浏览器不支持)
点击新建
点击建立分析对应的主题区域
在“打开”中可以查看已经建立好的分析,可以选择打开建立的分析,对分析进行修改编辑
新建分析后
可以编辑字段的排序,对字段使用公司计算,编辑过滤器筛选数据
结果展示编辑
添加分析提示,点击新建提示,选择列提示,选择基于哪个列建立提示
再次选择了公司名称的列建立提示,点击选项进行配置,选择特定列值选项,将需要的值放到右边,默认选择为当打开时默认勾选的值
例如默认为空值时
保存分析
- 建立仪表盘
为仪表盘命名,记住存储路径
然后到仪表盘编辑的界面
然后保存,运行
点击确定,展示一下界面
ending…