KPI模型数据补正问题及方法

浏览: 2895

前言:

很多情况下,kpi模型都会碰到一个问题,不能适用于所有的kpi,因为有些kpi在维度的不同级别的时候,合计值有可能不同,所以不能通过简单下钻来查看维度下一级别的数据情况。

 

以医院的出院病人数为例,大多情况下,医院的总病人数<>各个科室的病人数之和。

因为某个病人可能在呼吸内科待过,结果过了一段时间转到了ICU,那么呼吸内科和ICU在计算病人数(工作量)的时候,都会将这个病人算在内。

如果简单汇总的话,会发现医院的总体病人数多了,出现了数据重复的问题。

同样的情况还会出现在诊疗组级别到科室级别的汇总,医生到诊疗组级别的汇总。

 

 

解决方法:

其实对于这种情况,只要引入虚拟的维度数据,并在kpi的下一级别追加一条虚拟维度的补正数据即可。

还是以医院的出院病人为例,假设维度只有两级,定义为科室维,级别为:医院级->科室级。

注:当然实际情况,维度可能会有很多级,根据实际情况进行扩展补正即可。)

 

补正步骤:

1.先在KPI事实表内,插入各科室级别的出院病人数

2.然后在kpi事实表插入一条"虚拟科室"的数据,虚拟科室的出院病人数=医院的实际病人数-各科室的病人数之和

3.并且将这个"虚拟科室"补全到科室维表

 

经过这些步骤后,前端展现数据时,一开始可以显示医院的病人总数,在点击医院的时候,下钻到科室级别,会显示各科室的正确的病人数,和"虚拟科室"的补正数据。

 

如果不想显示"虚拟科室"的补正数据也很简单,只要在kpi事实模型了加一个标记(repeat_flag:Y/N),标记哪些记录是补正数据,然后前端显示数据时加一个条件,数据汇总以后having min(repeat_flag)<>'Y'即可。

 

示例数据:

KPI事实表结构:

DESC t_kpi_ft
Name Type Nullable Default Comments
------------------------- ----------- -------- ------- ------------
KPI_DATEUID NUMBER Y kpi的日期维
KPI_FYID NUMBER Y kpi所属分院
KPI_KSBZM VARCHAR2(30) Y kpi所属科室标准码
kpi_ysbzdm VARCHAR2(50) Y kpi所属医生标准码
KPI_ID NUMBER Y kpi的ID号
--KPI_VALUE NUMBER Y kpi值(做成前台rpd虚拟列)
KPI_NUMERATOR NUMBER Y kpi值-分子(如果无分母,则直接表示kpi)
KPI_DENOMINATOR NUMBER Y kpi值-分母(如果无分母,则为空)
KPI_TARGET_VALUE NUMBER Y kpi目标值
REPEAT_FLAG varchar2(1) 是否kpi重复值修正Y/N

 

数据补正:

--医生

insert into t_kpi_ft(
。。。。。。)
select 。。。。。。
group by a.cyrquid, a.fyid, a.fyksbzdm, a.ysbzdm, b.kpi_id;

 

--医生-》诊疗组补正

insert into t_kpi_ft(
。。。。。。)
with ys as (select a.KPI_DATEUID,
。。。。。。
ys_xz as (select a.KPI_DATEUID,
。。。。。。
xz as (
。。。。。。)
Select 。。。。。。
from xz a, t_kpi_dm b, ys_xz c
where b.kpi_id = 9
and a.kpi_xzbzdm=c.kpi_xzbzdm
and a.kpi_dateuid=c.kpi_dateuid
group by a.KPI_DATEUID,
a.KPI_FYID,
a.KPI_KSBZM,
a.kpi_xzbzdm||'_-1', b.kpi_id
having nvl(sum(a.KPI_NUMERATOR)-sum(c.KPI_NUMERATOR),0)<>0 or
nvl(sum(a.KPI_DENOMINATOR)-sum(c.KPI_DENOMINATOR),0)<>0 or
nvl(sum(a.KPI_TARGET_VALUE)-sum(c.KPI_TARGET_VALUE),0)<>0;
 

--诊疗组-》科室补正

insert into t_kpi_ft(
。。。。。。)
with xz as (select a.KPI_DATEUID,
。。。。。。
xz_ks as (select a.KPI_DATEUID,
。。。。。。
ks as (
。。。。。。)
Select 。。。。。。
from ks a, t_kpi_dm b, xz_ks c
where b.kpi_id = 9
and a.KPI_KSBZM=c.KPI_KSBZM
and a.kpi_dateuid=c.kpi_dateuid
group by a.KPI_DATEUID,
a.KPI_FYID,
a.KPI_KSBZM,
a.KPI_KSBZM||'_-1_-1', b.kpi_id
having nvl(sum(a.KPI_NUMERATOR)-sum(c.KPI_NUMERATOR),0)<>0 or
nvl(sum(a.KPI_DENOMINATOR)-sum(c.KPI_DENOMINATOR),0)<>0 or
nvl(sum(a.KPI_TARGET_VALUE)-sum(c.KPI_TARGET_VALUE),0)<>0;

 

--科室-》分院补正

insert into t_kpi_ft(
KPI_DATEUID ,
KPI_FYID ,
KPI_KSBZM ,
kpi_ysbzdm ,
KPI_ID ,
KPI_NUMERATOR ,
KPI_DENOMINATOR ,
KPI_TARGET_VALUE ,
repeat_flag)
with ks as (select a.KPI_DATEUID,
a.KPI_FYID,
a.KPI_KSBZM,
b.kpi_id KPI_ID,
sum(a.KPI_NUMERATOR) KPI_NUMERATOR,
sum(a.KPI_DENOMINATOR) KPI_DENOMINATOR,
sum(a.KPI_TARGET_VALUE) KPI_TARGET_VALUE
from t_kpi_ft a, t_kpi_dm b
where b.kpi_id = 9 and a.kpi_id=b.kpi_id
group by a.KPI_DATEUID,
a.KPI_FYID,
a.KPI_KSBZM,
b.kpi_id),
ks_fy as (select a.KPI_DATEUID,
a.KPI_FYID,
a.KPI_ID,
sum(KPI_NUMERATOR) KPI_NUMERATOR,
sum(KPI_DENOMINATOR) KPI_DENOMINATOR,
sum(KPI_TARGET_VALUE) KPI_TARGET_VALUE
from ks a
group by a.KPI_DATEUID,
a.KPI_FYID,
a.KPI_ID),
fy as (。。。。。。 )
select a.KPI_DATEUID,
a.KPI_FYID,
a.KPI_FYID||'_-1' KPI_KSBZM,
a.KPI_FYID||'_-1_-1_-1' kpi_ysbzdm,
b.kpi_id KPI_ID,
sum(a.KPI_NUMERATOR)-sum(c.KPI_NUMERATOR) KPI_NUMERATOR,
sum(a.KPI_DENOMINATOR)-sum(c.KPI_DENOMINATOR) KPI_DENOMINATOR,
sum(a.KPI_TARGET_VALUE)-sum(c.KPI_TARGET_VALUE) KPI_TARGET_VALUE,
'Y' repeat_flag
from fy a, t_kpi_dm b, ks_fy c
where b.kpi_id = 9
and a.KPI_FYID=c.KPI_FYID
and a.kpi_dateuid=c.kpi_dateuid
group by a.KPI_DATEUID,
a.KPI_FYID,
b.kpi_id
having nvl(sum(a.KPI_NUMERATOR)-sum(c.KPI_NUMERATOR),0)<>0 or
nvl(sum(a.KPI_DENOMINATOR)-sum(c.KPI_DENOMINATOR),0)<>0 or
nvl(sum(a.KPI_TARGET_VALUE)-sum(c.KPI_TARGET_VALUE),0)<>0;

 

--维表补全

--医生维

insert into t_ys_dm
select distinct 。。。。。。
where a.kpi_ysbzdm not in ( select bzdm from t_ys_dm );

 

--科室维

insert into t_ksdm_dm
select distinct a.kpi_ksbzm,a.kpi_fyid,b.flmc,0,'其他',0,'其他',-1,'补全',-1,'补全',-1,'补全',-1,'补全'
from t_kpi_ft a,t_fydm_dm b
where a.kpi_fyid=b.fyid
and a.kpi_ksbzm not in ( select bzdm from t_ksdm_dm );
commit;

 

前端数据展示:

显示补正数据:

 --下钻-》

 

隐藏补正数据:

--下钻-》

 

注意:

不管是否显示补正数据,各个科室的出院人次都是正确的,只是如果隐藏了补正人数时,在科室级别做简单合计的时候,数据会大于实际医院出院人次,因为病人可能待过多个科室(转科情况)。

推荐 1
本文由 newkoa 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册