ETL工具Informatica开发流程 综合应用 电信通话计费系统开发项目案例10

一世执手 提交于 2019-12-25 11:42:52

一、准备数据源

在Oracle数据库中创建 OLTP用户导入源数据 oracle_oltp_data.sql
在Mysql数据库中创建表,插入产品相关数据 mysql_product_data.sql
用户表ods_cust_info(oltp)     
地区表department(oltp)
通话表call_record(oltp)     
产品表product(mysql)


二、需求:

电信运营情况分析:从各业务系统数据分析一下公司运营情况(只分析通话,不分析流量)
报表结果: 
统计各维度与各指标的用户量与运营收入情况
维度(时间,地区,产品)
指标(用户数,运营收入)


三、开发思路

1:对地区维度表进行相应的处理
社区 ---->  端局 ------> 区局    
村          镇           县
create table department_dimension as
select 
a.dept_id dq_id,a.dept_name dq_name,a.level_no dq_level_no,
b.dept_id ju_id,b.dept_name ju_name,b.level_no ju_level_no,
c.dept_id sq_id,c.dept_name sq_name,c.level_no sq_level_no 
from 
(select dept_id,dept_name,level_no from department t where dept_type_no = 2) a,
(select dept_id,dept_name,level_no from department t where dept_type_no = 4) b,
(select dept_id,dept_name,level_no from department t where dept_type_no = 5) c
where a.level_no=substr(b.level_no,1,3) and b.level_no=substr(c.level_no,1,6);

2:对通话表进行查找,计算出 每个电话 每个月 按照时间顺序 拨打电话的 累计时长,费用计算规则
然后限定条件出其中一个电话,一个月的数据,来分析情况,其他的就都一个道理。
select 
  call_id,
  call_date,
  phone_no,
  begin_time,
  time_long,
  sum(time_long) over(partition by phone_no,to_char(call_date,'yyyy-mm') 
  order by to_char(call_date,'yyyy-mm-dd'),begin_time) leiji 
from call_record t
WHERE phone_no = 134*****678      --4G98    98   150    0.19
AND to_char(call_date,'yyyy-mm') = '2018-03';

select * from ods_cust_info where phone_no = 134*****678;  --prod_id = '4G98'

select * from product where prod_id = '4G98'; -- mysql  98   150    0.19

--电话          月份    套餐    套餐费用  通话时长  超出150分钟,0.19每分钟
--134*****678  2018-03  4G98    98        150       0.19

3:获得累计通话时长,及每次通话费用

select 
  call_id,
  call_date,
  phone_no,
  begin_time,
  time_long,
  leiji,
  (case when leiji>150 then 
      case when leiji-150-time_long<0 then (leiji-150)*0.19 
      else time_long*0.19 end
   else 0 end) c_feiyong  -- 超出套餐的每次通话费用 
from   
  (select 
        call_id,
        call_date,
        phone_no,
        begin_time,
        time_long,
        sum(time_long) over(partition by phone_no,to_char(call_date,'yyyy-mm') 
        order by to_char(call_date,'yyyy-mm-dd'),begin_time) leiji
   from call_record t
   WHERE phone_no = 134*****678      --4G98    98   150    0.19
   AND to_char(call_date,'yyyy-mm') = '2018-03' ); 


四、ETL工具Informatica开发流程核心思想与步骤

第一个功能:实现累计通话时长的输出

(暂时先只求一个电话一个月的)

1、导入源表

2、创建目标表,生成并执行sql

3、创建映射,编辑映射,连接并ctrl+S保存

4、创建任务,修改任务映射连接到对应的地方,保存,

5、创建工作流,连接任务,通过任务启动工作流,

6、监测执行完毕,检查目标数据。

第二个功能:实现多表连接,获取需求字段

目标计算每次通话的费用,需要知道用户的套餐类型(用户表)、套餐基本费用,免费时长、计费标准(产品表)等信息。

1、修改目标表,修改后生成并执行SQL

2、修改映射,delete映射与目标的连接 ,添加新的源和组件

3、断开W端,重新连接,刷新任务,修改任务映射,保存,然后从新启动任务。

4、查验数据

第三个功能:计算每次通话的费用

1、修改目标表

2、修改映射

iif( leiji>TO_DECIMAL(MF_TIME),
     iif(  leiji-TO_DECIMAL(MF_TIME)-TIME_LONG<0,
            (leiji-TO_DECIMAL(MF_TIME))*CALL_MINUTE_FEE,
            TIME_LONG*CALL_MINUTE_FEE),
     0)

3、刷新任务,从新执行,查验数据

第四个功能:删除限定一个用户一个月的条件,edw层费用明细表完成

1、删除单用户单个月的限定条件

2、ctrl+ s 保存映射,刷新任务,保存ctrl+s ,M端重新启动任务,数据库查验数据结果。

第五个功能:计算每个号码每月的通话费用

1、修改目标表,生成并执行sql

2、修改映射,添加聚合组件,修改,连接,保存

3、刷新任务,保存,从新启动任务,查验数据

五、DM层(按照不同维度、指标作进一步需求的分析)

1、和已经处理的地区表department_dimension关联,求每个地区每个月各套餐使用用户数及合计消费

select 
  call_date,
  dq_name,
  prod_id,
  count(phone_no) total,
  max(basic_fee) basic_fee,
  sum(call_fee) call_fee  
from edw_call_record t1,oltp.department_dimension t2
where t1.address=t2.sq_name
group by call_date,dq_name,prod_id
order by 1,2,3;

2、更多的进一步细化分析,可以根据需求进一步去做分析。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!