您的位置:首页 > 数据库 > Oracle

Oracle分析函数三、基于model函数建设口径统一的统计指标库

2018-03-22 14:02 519 查看

口径困境

做数据分析的同学经常被一个问题困扰,就是口径统一问题。核对数据、反复取数是很多IT部门永远的主题,造成这一困境有很多原因:

不同的技术人员对同一口径的理解不一样,导致取出数据不一致;

2.技术人员脚本编写随意,导致在不同时间对同一口径取出的数据不一致;

3.业务和技术理解不一致导致取出的数据不符合要求。

如何减少这类无效劳动,从个人的经验看,可以从两个方面入手改善:

1. 非技术层面,技术部门应与业务部门加强沟通,彻底理解需求

要拿出“准确”的数据,首先需要技术人员理解“真实”的需求,这一点对技术人员的要求很高,因为经常会碰到下面这种熟悉的场景:

(1) 有时候业务人员自己都没有搞明白需求,只是传达一下领导的口头表述,就向技术部门要数据。

(2)大部分业务人员对技术是不了解的,简单的业务表述在技术理解上却是有歧义的。比如说“按月统计销售额”,在技术人员看来是完全无法处理的,比如说“按月”的时间是按销售日期,还是按收款日期?退款的交易如何统计?

因此,即使一个简单的数据统计,绝不是需求部门写两句话,技术部门就可以马上拿出数据了,而是需要技术人员主动反复、详细地与业务人员沟通,罗列各种可能的技术口径,直至双方达成一致的理解。

2.技术层面,建立统计指标库来统一口径

经过详尽的沟通以及技术分析,对常用的统计口径建立指标库,有利于改善口径不一致的现象,从而减少重复劳动。

建立指标库的方法有很多,这里介绍一种结合model函数使用的指标库建立方法。

用Model分析函数搭建统计指标库

以下用本人做过的一个税务局的数据分析项目为例进行说明,部分步骤或功能做了简化处理,记录一下关键内容。

1.口径明细表

--口径代码表,主要配置了各个口径的取数SQL
CREATE TABLE T_DM_KJ
(KJ_DM   VARCHAR2(20)              --口径代码
,KJ_MC   VARCHAR2(50)              --口径名称
,MODSQL  VARCHAR2(1000)            --Model函数SQL
,YXBZ    VARCHAR2(1) DEFAULT 'Y'   --有效标志
,XGSJ    DATE DEFAULT SYSDATE      --修改时间
);


下面是部分配置样例



2.常用指标表

--指标代码表
--这是一个常用统计指标的字典,包含口径说明、业务负责人对口径的解释负责、
--技术负责人对技术口径实现负责。
CREATE TABLE T_DM_ZB
(ZB_DM  VARCHAR2(20)              --指标代码
,ZB_MC  VARCHAR2(50)              --指标名称
,KJSM   VARCHAR2(1000)            --口径说明
,YWRY   VARCHAR2(20)              --业务负责人
,JSRY   VARVHAR2(20)              --技术负责人
,YXBZ   VARCHAR2(1) DEFAULT 'Y'   --有效标志,Y-有效 N-无效
,XGSJ   DATE   DEFAULT SYSDATE    --修改时间
);


配置样例:



3.指标对应口径

--指标口径对应表
CREATE TABLE T_ZB_KJ
(ZB_DM   VARCHAR2(20)              --口径代码
,KJ_DM   VARCHAR2(50)              --口径名称
,PXH     NUMBER                    --排序号
,XSMC    VARCHAR2(50)              --显示名称
);


配置样例:



4.组装model语句的函数

基础表建好后,需要写一个函数,组装model子句

--组装MODEL语句
CREATE OR REPLACE FUNCTION F_MODELSQL(
V_ZBDM VARCHAR2,                  --指标代码
V_TJZ  VARCHAR2,                  --统计值(月累计-VALM、年累计-VALY)
V_TJGS VARCHAR2 DEFAULT 'SUM'     --统计公式(合计、计数、平均)
)
RETURN clob is

V_SQLOUT   clob;

begin
FOR REC_KJ IN
(SELECT A.KJ_DM,B.MODSQL
FROM T_ZB_KJ A,T_DM_KJ B
WHERE A.ZB_DM=V_ZBDM AND A.KJ_DM=B.KJ_DM)
LOOP
V_SQLOUT:=V_SQLOUT||CHR(10)||V_TJZ||'[''0'','''||TRIM(REC_KJ.KJ_DM)||''']='||V_TJGS||'('||V_TJZ||')['||REC_KJ.MODSQL||',ANY],';
END LOOP;

RETURN rtrim(V_SQLOUT,',');
end F_MODELSQL;


返回的语句经常会超过4000个字符,因此返回类型 用了clob类型。看一下执行结果:



5.应用

调用上面这个函数可以采用动态SQL,比如用于统计分税种税收收入:

V_SQL:=
'SELECT NY,SRXM,SE FROM (
SELECT TO_CHAR(RKRQ,''YYYYMM'') AS NY,ZSPM_DM,RPAD(''0'',50,''0'') SRXM,SUM(SE) AS SE
FROM ZS_RKMX
WHERE RKRQ>=DATE''2016-01-01'' AND RKRQ<DATE''2017-01-01''
GROUP BY TO_CHAR(RKRQ,''YYYYMM'')
)
MODEL RETURN UPDATED ROWS
PARTITION BY (NY)
DIMENSION BY (ZSPM_DM,SRXM)
MEASURES (SE)
('||F_MODELSQL('FSZSSSR','SE','SUM')||')'


实际应用中还要比上面的更加复杂很多,比如:

基础数据先进行加工汇总,一个数据只能有一个基础数据来源;

对where条件进行口径抽象,建成一个公用的筛选口径表,等等,不再详细赘述了。

总之,围绕model分析函数建立起一套统一口径的取数规则和取数程序,确实大大降低了口径解释、重复取数等工作量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: