一、准备数据源
在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、更多的进一步细化分析,可以根据需求进一步去做分析。
来源:CSDN
作者:Jalen data analysis
链接:https://blog.csdn.net/weixin_41685388/article/details/103668670