Essbase计算函数.doc_第1页
Essbase计算函数.doc_第2页
Essbase计算函数.doc_第3页
Essbase计算函数.doc_第4页
Essbase计算函数.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. 需求概述与OLAP基础1.1. 问题背景在联机分析处理(OLAP)中,那些具有度量性质的数据,我们称之为指标。如购入、售出和销量这类数据。看下面这个例子:销售额、成本和利润是3个指标,通过销售额与成本可以计算出获得的利润;如此销售额和成本可看作基本数据,而利润可看作计算数据,因为它需要通过基本数据计算才能得到。在OLAP中,这类计算数据可以通过制定对应的计算规则来计算。1.2. 内容概要介绍应用中处于中心地位的OLAP基础知识,包括数据大纲(outline),维度(dimension),粒度(member),代(generation)和层(tier)的概念。在计算规则部分,对常用的计算指标进行了分类,并对各种指标的计算作了通用方法的指导。对最常用的多个指标函数进行了讲解。作为例子,从在工业产销存的应用中的相关的查询需求分析所需的计算指标进行了例示。1.3. OLAP基础1.3.1. 什么是OLAP联机分析处理(OLAP)的概念最早是由关系数据库之父E.F.Codd于1993年提出的。Codd认为联机事务处理(OLTP)已不能满足终端用户对数据库查询分析的需要,SQL对大数据库进行的简单查询也不能满足用户分析的需求。用户的决策分析需要对关系数据库进行大量计算才能得到结果,而查询的结果往往并不能满足决策者提出的需求。因此Codd提出了多维数据库和多维分析的概念,即OLAP。1.3.2. 维和维的结构(代与层)观察数据的方面称为维,而观测的层次称作维的粒度(成员),比如从时间方面来考察数据,而观测的层次可以是天、月、季、年,所以时间可以看作是维,而天、月、季、年可以看作是时间维上的不同粒度。维分为稀疏维和稠密维,也可以分为标准维和属性维。一般来说,在设计数据大纲时,指标维和时间维是具有特殊地位的标准维。代和层表达了一个维的层次结构。代是从上而下的方式来计算的,如时间维的第一个成员是年,那么年的代值为2,比年小一点的粒度如果是季,则季的代值是3,如此递加1,起始值为2。比如可以设计一个时间维(TIME),成员为年、季、月、旬、日,则日粒度代值为6;层与代计算的方向刚好相反。计算起始值是0,0层成员的父亲是第1层,由于计算方式的不同,就可以表示出结构不对称得数据大纲结构。1.4. 工业产、销、存应用1.4.1. 工业产销存应用的OLAP数据大纲设计对工业产销存应用,OLAP数据大纲设计 (Outline)中使用了5个标准维度来存储工业产、销、存的数据,分别是指标维、时间维、区域维、产品名称维和产品生产企业维。MEASURES是指标维名称, TIME设计为时间维名称, I_PROVINCE代表区域, CIGARETTE 是卷烟产品维的名称,INDU表示工业企业维。如图:(其他维度为属性维)2. 指标理解2.1. 什么是指标需要度量的(measure)或账目的(account)数据名称。如生产量、销售额、支出货币等。同时关于它们的具有比较和统计意义的数据名称。如同期增长、利润额等。2.2. 指标分类2.2.1. 基本属性1 存储分类指标对应的数据值有3种存储类型,一般存储、动态计算不存储和动态计算并存储。2 计算分类一种是指数据源通过规则文件将数据直接载入,其实也就是不计算。这类数据可以作为计算其他数据的依据;一种是子代到父代的汇总计算,存在多层结构时,比如观察时间维的数据,如果数据源中只有天的数据,OLAP就可以依靠指定的汇总方式,通过子代成员计算父代成员的数据,如你所想的,OLAP能够自动地将属于某个月下的所有天成员数据全部相加而得到月成员数据,这种计算由OLAP完成,无需定义计算规则;一种是规则计算。 这种计算正是我们所称的计算规则。2.2.2. 计算规则类别1 同期:(2006年3月跟2005年3月,年粒度相同)明显地,同期计算是对时间维定义而言的。我们的同期是指在年粒度上相同。比如当前时间为3月,则它的同期量是指去年3月的数据。2 累计要求累计数据到当前时间的总值。比如月累计,年累计。3 环比类同在一个维度下的指标,它们之间的变化量和百分比等计算称作环比类计算。如利润额等计算。4 时间是指像库存这样的计算,前期的库存作为本期库存的起始值。一般来说,这类计算所计算的指标在意义上都具有历史性和不独立性。5 以上组合如同期累计,同期增加。这类计算意义上是基础类型的组合,在计算规则编写是体现为简单嵌套。3. 规则设计没有数据存储在任何成员下。在我们的例子中,对于每一个存储的数据,都是全部5个维度共同指定的。计算一个指定的值往往并没有提供所有5个维的信息,这是因为当前计算情景总作为默认参数。在OLAP具体计算时,它根据数据大纲结构迭代计算,所有5个计算维度在当前计算的信息是确定的。在这里定义一下关于当前成员(current member)的意义,当前成员在每一个维上对应着具体的成员。在任一个计算情景下,每一个标准维都参与了一个成员,比如OLAP当前计算 “ 出厂产量、第三季、云南、红塔、工业企业”,那么当前成员在时间维上就是第三季,而在卷烟维上就是红塔。而“北京、工业企业”本来是不完全的,没有数据和它关联。但是实际计算中,根据当前计算的信息确定性(上面一段所述),将会用当前计算的成员去补充“北京、工业企业”所不具有的维成员。(另一方面,如果计算不具有迭代计算环境,即:OLAP根据数据大纲结构进行的计算,将会用其他维的最大粒度成员去补充“北京、工业企业”所不具有的维成员。)因为所有的函数计算都具有上述特点,所以将不再描述。3.1. 常用函数介绍3.1.1. ISGEN()3.1.1.1. 函数原形ISGEN(dimName, genName | genNum)dimName:维名;genName: 代值别名;genNum:代值 3.1.1.2. 例子如果当前计算成员在指定维中正是指定的代值,则返回1,否则返回0。ISGEN(Market,2)判断是否在Market维上是第二代。如果当前成员在区域维上是第2代即east, north, west或则south;就返回TRUE;其他则返回FALSE。 3.1.2. GENMBRS()3.1.2.1. 函数原形GENMBRS(dimName, genName|genNum)dimName:维名;genNum:代值;genName:成员名称。3.1.2.2. 例子这个函数返回一个指定维下属于指定代的所有成员名称。它是一个集合。GENMBRS(TIME, 200539)返回结果:200511,200512,200513,200524,200525,. 2005412,这个结果表明计算是在TIME维进行的,返回了所有的月份成员。3.1.3. ILSIBLINGS()3.1.3.1. 函数原形ILSIBLINGS(mbrName)mbrName :成员名3.1.3.2. 例子这个函数返回一个集合,包含指定成员的兄弟。如果存在同一个父代成员就是兄弟关系,比如第二季有子代4,5,6月 。那么4,5,6月 就是兄弟关系。I表示包含自身,L表示在自身前面的兄弟,所以它返回的是包含自身的前左兄弟集合。ILSIBLINGS (200513)返回同在一个父亲下的兄弟成员。即200511 200512 和 200513。3.1.4. SUMRANGS() 3.1.4.1. 函数原形SUMRANGE(mbrName , rangeList)mbrName: 维名;rangeList:表示一个集合3.1.4.2. 例子这是一个求和的函数。它返回指定成员关于指定集合范围内所有值的和。rangeList表示一个集合,可选参数,如果不提供,它的默认值指定为时间维上所有最细粒度成员的集合。SUMRANGE(New York, Jan:Jun)返回从一月到七月在纽约的所有数据的总计。3.1.5. ANCESTVAL( )3.1.5.1. 函数原形ANCESTVAL (dimName, genLevNum , mbrName)dimName:维名称;genLevNum:指定代值或层的值;mbrName:成员名称;可选参数;3.1.5.2. 例子返回当前计算在指定维上指定代的值。其中可选参数指定一个成员名称,它表示返回的值是这个成员参与指定的值。成员与存储数据(值)的关系请返回到本章起始段。ANCESTVAL(Product,2,Sales)返回当前计算在产品维第二代关于Sales的数据。3.1.6. CURRMBR( )3.1.6.1. 函数原形CURRMBR(dimName)dimName: 维名称。3.1.6.2. 例子返回当前计算在指定维上的成员的名字。CURRMBR (Year)如果当前计算在Year维上的成员是Mar,则返回Mar。3.1.7. PRIOR()3.1.7.1. 函数原形PRIOR (mbrName , n, rangeList)mbrName:成员名称;n:数字,可以是负数rangList: 集合3.1.7.2. 例子n是可选参数,默认为1;rangeList表示一个集合,可选参数,如果不提供,它的默认值指定为时间维上所有最细粒度集合。函数返回指定的集合范围内相对于当前计算成员的,前面第n个成员的值,其中参数成员名称指定当前计算要返回的值,这个成员名称往往是一个指标成员的名称。这个函数首先在OLAP中获得当前成员(current member)在某个维上的成员名称,而这个维与集合(rangelist)成员属于同一个维, 然后定位当前成员在列表中的位置,再由整数n指定从当前成员往前数的第几个成员。OLAP将返回这个n指定的成员在指标mbrName下的数据。PRIOR (IND_PROD_R_CURR, 1, GENMBRS (TIME, 3)返回在时间上往前一个月的值,参数1可以省略。3.2. 如何编写各种指标类型的计算规则3.2.1. 同期指标3.2.1.1. 指标含义同期指标对应了一个具体的指标,表示具体指标的同期值。通过时间维度上同期指标的计算,可以获知去年的数据,然后通过比较本期,我们可以了解增加还是减少了,变化量多大。3.2.1.2. 计算思路PRIOR( )函数是完成这类计算任务而设计的。所以我们使用PRIOR()函数。3.2.1.3. 计算规则注PRIOR( )函数的行为,这个函数返回指定成员前面的某个成员的的值,只要指定好整数n和成员集合就可以求出所求数据。例如:求旬粒度的出厂产量同期值,因为年包括了36个旬,所以如下:PRIOR(“出产量”,36,GENMBRS(TIME,5))便可以返回旬的同期值,如没有去年的数据,则返回#MISSING。3.2.1.4. 例子以工业产销存模型为例,指标IND_PROD_R_LAST是同期指标,规则设计如下:/ISGEN (TIME, 5)判断是否是旬粒度,GENMBRS (TIME, 5)返回所有时间维第5代的成员集合;使用 PRIOR函数求第5代成员集合中相对于当前计算成员的前面第36个成员所对应IND_PROD_R_CURR的值,数字36正好说明一年有36个旬IF (ISGEN (TIME, 5) PRIOR (IND_PROD_R_CURR, 36, GENMBRS (TIME, 5); /ISGEN (TIME, 4) 条件判断是否是月粒度,GENMBRS (TIME, 4)返回所有时间维第4代的成员集合;使用 PRIOR函数求第4代成员集合中相对于当前计算成员的前面第12个成员所对应IND_PROD_R_CURR的值,数字12正好说明一年有12个月ELSEIF (ISGEN (TIME, 4) PRIOR (IND_PROD_R_CURR, 12, GENMBRS (TIME, 4); / ISGEN (TIME, 3)条件判断是否是季粒度,GENMBRS (TIME,3)返回所有时间维第3代的成员集合;使用 PRIOR函数求第3代成员集合中相对于当前计算成员的前面第4个成员所对应IND_PROD_R_CURR的值,数字4正好说明一年有4个季ELSEIF (ISGEN (TIME, 3) PRIOR (IND_PROD_R_CURR, 4, GENMBRS (TIME, 3);/ ISGEN (TIME, 2) 条件判断是否是年粒度,GENMBRS (TIME,2)返回所有时间维第2代的成员集合;使用 PRIOR函数求第2代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一年的值ELSEIF (ISGEN (TIME, 2) PRIOR (IND_PROD_R_CURR, 1, GENMBRS (TIME, 2);ENDIF;思路:GENMBRS (TIME, n),返回指定维的指定代的成员列表。因为当前成员(current member)在时间维上所处的代值不同,公式也随之改变。rangelist表示一个成员集合,这些集合里的所有成员都同在一个维度里。PRIOR()函数返回某个相同指标下的值,这个指标名字是mbrName。首先olap获得当前成员(current member)在某个维上的成员名称,这个维与集合(rangelist)成员所在的维是同一个维, 然后定位当前成员在列表中的位置,再由整数n指定从当前成员往前数的第几个成员。Olap将返回这个n指定的成员在指标mbrName下的数据。3.3. 上期指标(上期可以在任何粒度上,包括年-天)与同期不同,天粒度的上期即指昨天,月的上期即指上一个月,而年即指去年。仍然使用PRIOR()函数。相对于同期指标的计算更简单,因为在PRIOR()中整数参数总是指定为1。3.3.1.1. 指标含义在当前粒度下观察最近期的数据,这样可比较得出最新的变化趋势。3.3.1.2. 计算思路使用PRIOR()函数,或许可以这样认为:同期和上期都是PRIOR()函数应用的特殊情况。一个“前”到年,一个只“前”一步。3.3.1.3. 计算规则如PRIOR(“出产量”,1,GENMBRS(“TIME”)),比同期更简单的是总是指定前“1”,并且完全可以不写,缺省就指定为1;如果在时间维上当前成员是第0层。则集合参数也可省略。3.3.1.4. 例子以工业产销存模型为例,指标IND_PROD_R_PREV是同期指标,规则设计如下 Formulas规则/ ISGEN (TIME,5) 条件判断是时间维上的旬粒度,GENMBRS (TIME,5)返回所有时间维第5代的成员集合;使用 PRIOR函数求第5代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一个成员的值IF (ISGEN (TIME, 5)PRIOR(IND_PROD_R_CURR, 1, GENMBRS (TIME, 5);/ISGEN (TIME,4) 条件判断是时间维上的月粒度,GENMBRS (TIME,4)返回所有时间维第4代的成员集合;使用 PRIOR函数求第4代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一个成员的值ELSEIF (ISGEN (TIME, 4)PRIOR (IND_PROD_R_CURR, 1, GENMBRS (TIME, 4); /ISGEN (TIME,3) 条件判断是时间维上的季粒度,GENMBRS (TIME,3)返回所有时间维第3代的成员集合;使用 PRIOR函数求第3代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一个成员的值ELSEIF(ISGEN (TIME, 3)PRIOR (IND_PROD_R_CURR, 1, GENMBRS (TIME, 3);/ ISGEN (TIME, 2) 条件判断是否是年粒度,GENMBRS (TIME,2)返回所有时间维第2代的成员集合;使用 PRIOR函数求第2代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一年的值ELSEIF(ISGEN (TIME, 2) PRIOR (IND_PROD_R_CURR, 1, GENMBRS (TIME, 2); ENDIF; 思路:GENMBRS (TIME, n),返回指定维的指定代的成员列表。全因为当前成员(current member)在时间维上的所处不同的代值,公式随之改变。rangelist表示一个成员集合,这些集合里的所有成员都同在一个维度里。PRIOR()函数返回某个相同指标下的值,这个指标名字是mbrName。首先olap获得当前成员(current member)在某个维上的成员名称,这个维与集合(rangelist)成员所在的维是同一个维, 然后定位当前成员在列表中的位置,再由整数n指定从当前成员往前数的第几个成员。在上期指标的计算中,总是指定数字值为1;OLAP将返回这个n指定的成员在指标mbrName下的数据。3.4. 累计指标累计就是求和;本月22号的月累计是指1-22号的累计值。23号就是1-23号这段时间的累计。它的计算与当前成员粒度有关。如9月8号的季累计是7月、8月和截至9月8号的累计值。因为当前季包含7月、8月和9月。3.4.1. 指标含义通过累计指标,可以观测总值的每一个粒度里的具体变化。3.4.2. 计算思路(注:本思路要求OLAP中已存在数据具有一定的条件)假设这样一种情况,当前OLAP在某维中第n层计算累计指标,想想这种思路:我们知道当前成员在同一层的所有兄弟(注:有相同父亲的称为兄弟,兄弟显然是在同一个层,但同一层上的成员却不一定是兄弟,因为所有成员可能不属于同一个父亲)的累计的值就是其父亲成员的数据。这样就可以发现一种通过父亲的数据来求当前累计的方法。我们可以想:子代的数据的累计与父代的数据不同的就是父亲数据是所有子代成员的数据总和,而子代累计是某个起点(比如每月的第一天)到当前子代(不如今天是9月18号)的数据总和。那么从父代的值里减去当前成员之后的子代数据累计,就可以达到目的。3.4.3. 计算规则使用IRSIBLINGS(mbrName)和ANCESTVAL (dimName, genLevNum , mbrName)以及SUMRANGE(mbrName , rangeList)来嵌套计算。每一个函数的讲解在2.2小节。使用IRSIBLINGS(mbrName)可以得到右兄弟成员,结果作为一个成员集合参数传给SUMRANGE(mbrName , rangeList),可以计算出右兄弟成员的累计。而ANCESTVAL (dimName, genLevNum , mbrName)函数通过指定相关的维度名称和代值,就可求出在4.3.2中分析的父代数据。然后运用减法完成指标的定义。3.4.4. 年、季、月例子3.4.4.1. 月累计以工业产销存模型为例,指标IND_PROD_R_M_SUM是同期指标,它的意义:月累计,是指到当前的累计。本月22号的月累计是指1-22号的累计值。23号就是1-23号这段时间的累计。规则设计如下 Formulas规则:/ISGEN(TIME,6)判断是否是天粒度,如果是天粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,因为已经判断出是天粒度,则它返回的是某一天的成员名称。使用RSIBLINGS(CURRMBR(TIME)可以得到具体这一天右兄弟成员集合SUMRANGE(IND_PROD_R_CURR, RSIBLINGS(CURRMBR(TIME),可以计算出右兄弟成员关于IND_PROD_R_CURR的累计。而ANCESTVAL (TIME,5)函数通过指定相关的维度名称和代值,返回时间维上第5代的累计值。然后时间维上第5代的累计值减去右兄弟累计值。IF(ISGEN(TIME,6)ANCESTVAL(TIME,5)-SUMRANGE(IND_PROD_R_CURR, RSIBLINGS(CURRMBR(TIME);/ISGEN(TIME,5)判断是否是旬粒度,如果是旬粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,使用ILSIBLINGS(CURRMBR(TIME)可以得到具体这一天包括自身的左兄弟成员集合, SUMRANGE(IND_PROD_R_CURR, ILSIBLINGS(CURRMBR(TIME),可以计算出包括自身的左兄弟成员关于IND_PROD_R_CURR的累计。ELSEIF (ISGEN(TIME,5)SUMRANGE(IND_PROD_R_CURR, ILSIBLINGS(CURRMBR(TIME);/如果当前计算就是月粒度计算,则直接返回IND_PROD_R_CURR;ELSEIF (ISGEN(TIME,4)IND_PROD_R_CURR;ELSE0;ENDIF; 方案及思路:这个指标出现了5个函数。在最小粒度天的计算方式是用ANCESTVAL(TIME,5)找到本旬关于月累计的值,然后剪去当天不足一旬相差的天的累计值。RSIBLINGS( )能获得与当前粒度相同的右兄弟集合。而SUMRANGE刚好是计算一个集合在某个指标上的累计值。而在旬粒度上求月累计则只需SUMRANGE( )计算旬兄弟累计可得。3.4.4.2. 季累计以工业产销存模型为例,指标IND_PROD_R_Q_SUM是同期指标,它的意义:季累计 ,是指到当前的累计。例如9月22号的季累计是指7月1号到9月22号的累计值。7、8、和9月为一年中第三季。所以9月23号就是7月初到9月23号这段时间的累计。规则设计如下 :Formulas规则:/ISGEN(TIME,6)判断是否是天粒度,如果是天粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,因为已经判断出是天粒度,则它返回的是某一天的成员名称。使用RSIBLINGS(CURRMBR(TIME)可以得到具体这一天右兄弟成员集合, SUMRANGE(IND_PROD_R_CURR, RSIBLINGS(CURRMBR(TIME),可以计算出右兄弟成员关于IND_PROD_R_CURR的累计。而ANCESTVAL (TIME,5,IND_PROD_R_Q_SUM)函数通过指定相关的维度名称和代值,返回时间维上第5代的关于IND_PROD_R_Q_SUM指标的值。然后时间维上第5代的值减去右兄弟累计值。 IF(ISGEN(TIME,6)ANCESTVAL(TIME,5,IND_PROD_R_Q_SUM) - SUMRANGE(IND_PROD_R_CURR, RSIBLINGS( CURRMBR(TIME);/ISGEN(TIME,5)判断是否是旬粒度,如果是旬粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,因为已经判断出是旬粒度,则它返回的是某一旬的成员名称。使用RSIBLINGS(CURRMBR(TIME)可以得到具体这一旬右兄弟成员集合, SUMRANGE(IND_PROD_R_CURR, RSIBLINGS(CURRMBR(TIME),可以计算出右兄弟成员关于IND_PROD_R_CURR的累计。而ANCESTVAL (TIME,4)函数通过指定相关的维度名称和代值,返回时间维上第4代的累计值。即月粒度的值。然后时间维上第4代的累计值减去右兄弟累计值。ELSEIF(ISGEN(TIME,5)ANCESTVAL(TIME,4,IND_PROD_R_Q_SUM) -SUMRANGE(IND_PROD_R_CURR,RSIBLINGS( CURRMBR(TIME);/ISGEN(TIME,4)判断是否是月粒度,如果是月粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,使用ILSIBLINGS(CURRMBR(TIME)可以得到具体这一月包括自身的左兄弟成员集合, SUMRANGE(IND_PROD_R_CURR, ILSIBLINGS(CURRMBR(TIME),可以计算出包括自身的左兄弟成员关于IND_PROD_R_CURR的累计。ELSEIF (ISGEN(TIME,4)SUMRANGE(IND_PROD_R_CURR, ILSIBLINGS( CURRMBR(TIME) ) );/如果当前计算就是季粒度计算,则直接返回IND_PROD_R_CURR;ELSEIF (ISGEN(TIME,3)IND_PROD_R_CURR;ELSE0;ENDIF; 方案及思路: 在最小粒度天的计算方式是用ANCESTVAL(TIME,5)找到本旬关于季累计的值,然后剪去当天不足一旬相差的天的累计值。当前计算在旬粒度上时,可以用相同的方法。先找到月的季累计值,然后剪去没有包括在累计中的其它旬累计。月粒度上求季累计只需用SUMRANGE(IND_PROD_R_CURR, ILSIBLINGS( CURRMBR(TIME) ) );累计包括自己在内的左兄弟的数据。3.4.4.3. 年累计以工业产销存模型为例,指标IND_PROD_R_Q_SUM是同期指标,它的意义:季累计 ,是指到当前的累计。例如9月22号的季累计是指7月1号到9月22号的累计值。7、8、和9月为一年中第三季。所以9月23号就是7月初到9月23号这段时间的累计。规则设计如下 :Formulas规则:/ISGEN(TIME,6)判断是否是天粒度,如果是天粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,因为已经判断出是天粒度,则它返回的是某一天的成员名称。使用RSIBLINGS(CURRMBR(TIME)可以得到具体这一天右兄弟成员集合, SUMRANGE(IND_PROD_R_CURR, RSIBLINGS(CURRMBR(TIME),可以计算出右兄弟成员关于IND_PROD_R_CURR的累计。而ANCESTVAL (TIME,5)函数通过指定相关的维度名称和代值,返回时间维上第5代的累计值。然后时间维上第5代的累计值减去右兄弟累计值。IF(ISGEN(TIME,6)ANCESTVAL(TIME,5)SUMRANGE(IND_PROD_R_CURR,RSIBLINGS(CURRMBR(TIME);/ISGEN(TIME,5)判断是否是旬粒度,如果是旬粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,因为已经判断出是旬粒度,则它返回的是某一旬的成员名称。使用RSIBLINGS(CURRMBR(TIME)可以得到具体这一旬右兄弟成员集合, SUMRANGE(IND_PROD_R_CURR, RSIBLINGS(CURRMBR(TIME),可以计算出右兄弟成员关于IND_PROD_R_CURR的累计。而ANCESTVAL (TIME,4)函数通过指定相关的维度名称和代值,返回时间维上第4代的累计值。即月粒度的值。然后时间维上第4代的累计值减去右兄弟累计值。ELSEIF(ISGEN(TIME,5)ANCESTVAL(TIME,4)SUMRANGE(IND_PROD_R_CURR,RSIBLINGS(CURRMBR(TIME);/ISGEN(TIME,4)判断是否是季粒度,如果是季粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员。使用RSIBLINGS(CURRMBR(TIME)可以得到具体这一旬右兄弟成员集合,SUMRANGE(IND_PROD_R_CURR, RSIBLINGS(CURRMBR(TIME),可以计算出右兄弟成员关于IND_PROD_R_CURR的累计。而ANCESTVAL (TIME,3)函数通过指定相关的维度名称和代值,返回时间维上第3代的累计值。即季粒度的值。然后时间维上第4代的累计值减去右兄弟累计值ELSEIF(ISGEN(TIME,4)ANCESTVAL(TIME,3) SUMRANGE (IND_PROD_R_CURR, RSIBLINGS( CURRMBR(TIME);/ISGEN(TIME,3)判断是否是季粒度,如果是则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,使用ILSIBLINGS(CURRMBR(TIME)可以得到具体这一天包括自身的左兄弟成员集合, SUMRANGE(IND_PROD_R_CURR, ILSIBLINGS(CURRMBR(TIME),可以计算出包括自身的左兄弟成员关于IND_PROD_R_CURR的累计。ELSEIF(ISGEN(TIME,3)SUMRANGE(IND_PROD_R_CURR,ILSIBLINGS(CURRMBR(TIME);/如果当前计算就是年粒度计算,则直接返回IND_PROD_R_CURRELSEIF (ISGEN(TIME,2) IND_PROD_R_CURR;ELSE 0;ENDIF; 方案及思路:通过月累计、季累计计算指标的求法,可以发现这种计算的规律;我们总是通过其父代的累计值,剪去右兄弟累计值而得到当前累计值。这是当计算累计的粒度比当前不只高一代,例如求年累计时,如当前计算粒度是天,相差了4代,则用其父代旬的年累计。这样我们就可以使用兄弟函数。如果只是相差一代,就使用SUMRANGE()嵌套SIBLINGS()求累计。3.5. 同期增加和同期增长只需用本期值减去同期值即可。/同期增加,只是将VAR()改为使用VARPER()VARPER (IND_PROD_R_CURR, IND_PROD_R_LAST); 以工业产销存模型为例,令IND_PROD_R_LAST_INC表示同期增加,它的计算规则如下:VAR( )用于计算变化量。而它的计算方式还与指标标注的属性有关。当默认标注为expense时,计算方法为mbrName1-mbrName2,当标注为no expense则为mbrName2-mbrName1。VAR(IND_PROD_R_CURR, IND_PROD_R_LAST);而同期增长,表示增量占初始数据的百分比。 功能上比VAR()上多了一个百分比计算,相对于哪一个前一个还是后一个值得百分比,因标注而不同。标注为expense时,则以mbrName2计算变化量的百分比。4. 工业产、销、存的计算规则4.1. 工业产销存计算规则列举4.1.1. IND_PROD_R_CURR 意义:本期累计 Formulas规则:不需要计算。 4.1.2. IND_PROD_R_PREV意义:上期累计值 Formulas规则:可参考4.2上期指标描述/ ISGEN (TIME,5) 条件判断是时间维上的旬粒度,GENMBRS (TIME,5)返回所有时间维第5代的成员集合;使用 PRIOR函数求第5代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一个成员的值IF(ISGEN (TIME, 5) PRIOR (IND_PROD_R_CURR, 1,GENMBRS (TIME, 5);/ISGEN (TIME,4) 条件判断是时间维上的月粒度,GENMBRS (TIME,4)返回所有时间维第4代的成员集合;使用 PRIOR函数求第4代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一个成员的值ELSEIF(ISGEN (TIME, 4) PRIOR (IND_PROD_R_CURR, 1,GENMBRS (TIME, 4); /ISGEN (TIME,3) 条件判断是时间维上的季粒度,GENMBRS (TIME,3)返回所有时间维第3代的成员集合;使用 PRIOR函数求第3代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一个成员的值ELSEIF(ISGEN (TIME, 3) PRIOR (IND_PROD_R_CURR, 1, GENMBRS (TIME, 3);/ISGEN (TIME,2) 条件判断是时间维上的年粒度,GENMBRS (TIME,2)返回所有时间维第2代的成员集合;使用 PRIOR函数求第2代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一个成员的值ELSEIF(ISGEN (TIME, 2) PRIOR (IND_PROD_R_CURR, 1, GENMBRS (TIME, 2); ENDIF; 方案与思路:GENMBRS (TIME, n),返回指定维的指定代的成员列表。因为当前成员(current member)在时间维上的所处不同的代值,公式随之改变。rangelist表示一个成员集合,这些集合里的所有成员都同在一个维度里。PRIOR()函数返回某个相同指标下的值,这个指标名字是mbrName。首先olap获得当前成员(current member)在某个维上的成员名称,这个维与集合(rangelist)成员所在的维是同一个维, 然后定位当前成员在列表中的位置,再由整数n指定从当前成员往前数的第几个成员。在上期指标的计算中,总是指定数字值为1;Olap将返回这个n指定的成员在指标mbrName下的数据。4.1.3. IND_PROD_R_PREV_INS 意义:环比增加-实物产量 Formulas规则:VAR (IND_PROD_R_CURR, IND_PROD_R_PREV);/ VAR( )用于计算变化量。而它的计算方式还与指标标注的属性有关。当默认标注为expense时,计算方法为mbrName1-mbrName2,当标注为no expense则为mbrName2-mbrName1。 4.1.4. IND_PROD_R_PREV_INV_R 意义:实物产量环比增长 Formulas规则:VARPER (IND_PROD_R_CURR, IND_PROD_R_PREV); /在VAR()的基础上多了一个百分比计算,相对于哪一个mbrName,因为标注而不同,标注为expense时,则以mbrName2计算变化量的百分比。4.1.5. IND_PROD_R_LAST意义: 同期指标,前期的意义相似于上期,如果当前时间维上的成员为9月,上期就是8月。如果基于年来说,前期就是指去年9月,如果基于半年来说则指今年3月。在我们的计算规则中,前期是用年的意义来定义的。Formulas规则: 参考3.1同期指标描述/ISGEN (TIME, 5)条件判断是否是旬粒度,GENMBRS (TIME, 5)返回所有时间维第5代的成员集合;使用 PRIOR函数求第5代成员集合中相对于当前计算成员的前面第36个成员所对应IND_PROD_R_CURR的值,数字36正好说明一年有36个旬IF (ISGEN (TIME, 5) PRIOR (IND_PROD_R_CURR, 36, GENMBRS (TIME, 5); /ISGEN (TIME, 4) 条件判断是否是月粒度,GENMBRS (TIME, 4)返回所有时间维第4代的成员集合;使用 PRIOR函数求第4代成员集合中相对于当前计算成员的前面第12个成员所对应IND_PROD_R_CURR的值,数字12正好说明一年有12个月 ELSEIF (ISGEN (TIME, 4) PRIOR (IND_PROD_R_CURR, 12, GENMBRS (TIME, 4); / ISGEN (TIME, 3)条件判断是否是季粒度,GENMBRS (TIME,3)返回所有时间维第3代的成员集合;使用 PRIOR函数求第3代成员集合中相对于当前计算成员的前面第4个成员所对应IND_PROD_R_CURR的值,数字4正好说明一年有4个季 ELSEIF (ISGEN (TIME, 3) PRIOR (IND_PROD_R_CURR, 4, GENMBRS (TIME, 3);/ ISGEN (TIME, 2) 条件判断是否是年粒度,GENMBRS (TIME,2)返回所有时间维第2代的成员集合;使用 PRIOR函数求第2代成员集合中相对于当前计算成员的前面第1个成员所对应IND_PROD_R_CURR的值,数字1正好说明所求就是前面一年的值ELSEIF (ISGEN (TIME, 2) PRIOR (IND_PROD_R_CURR, 1, GENMBRS (TIME, 2);ENDIF; 方案及思路:GENMBRS (TIME, n),返回指定维的指定代的成员列表。全因为当前成员(current member)在时间维上的所处不同的代值,公式随之改变。rangelist表示一个成员集合,这些集合里的所有成员都同在一个维度里。PRIOR()函数返回某个相同指标下的值,这个指标名字是mbrName。首先olap获得当前成员(current member)在某个维上的成员名称,这个维与集合(rangelist)成员所在的维是同一个维, 然后定位当前成员在列表中的位置,再由整数n指定从当前成员往前数的第几个成员。我们将其中的整数参数指定为我们想要的数据位置。所以在旬的粒度上,前面第36个同代成员刚好与自己同期,并且刚好隔一年。同理在月的粒度上,整数参数取12,季粒度时整数参数取4。4.1.6. IND_PROD_R_M_SUM意义:月累计 ,是指到当前的累计。本月22号的月累计是指1-22号的累计值。23号就是1-23号这段时间的累计。 Formulas规则:参考3.4累计指标/ISGEN(TIME,6)判断是否是天粒度,如果是天粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,因为已经判断出是天粒度,则它返回的是某一天的成员名称。使用RSIBLINGS(CURRMBR(TIME)可以得到具体这一天右兄弟成员集合, SUMRANGE(IND_PROD_R_CURR, RSIBLINGS(CURRMBR(TIME),可以计算出右兄弟成员关于IND_PROD_R_CURR的累计。而ANCESTVAL (TIME,5)函数通过指定相关的维度名称和代值,返回时间维上第5代的累计值。然后时间维上第5代的累计值减去右兄弟累计值。IF(ISGEN(TIME,6)ANCESTVAL(TIME,5)-SUMRANGE (IND_PROD_R_CURR, RSIBLINGS(CURRMBR(TIME);/ISGEN(TIME,5)判断是否是旬粒度,如果是旬粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,使用ILSIBLINGS(CURRMBR(TIME)可以得到具体这一天包括自身的左兄弟成员集合, SUMRANGE(IND_PROD_R_CURR, ILSIBLINGS(CURRMBR(TIME),可以计算出包括自身的左兄弟成员关于IND_PROD_R_CURR的累计。ELSEIF ( ISGEN(TIME,5)SUMRANGE(IND_PROD_R_CURR, ILSIBLINGS( CURRMBR(TIME) ) );/如果当前计算就是月粒度计算,则直接返回IND_PROD_R_CURR;ELSEIF (ISGEN(TIME,4)IND_PROD_R_CURR;ELSE 0;ENDIF; 方案及思路:这个指标出现了5个函数。在最小粒度天的计算方式是用ANCESTVAL(TIME,5)找到本旬关于月累计的值,然后剪去当天不足一旬相差的天的累计值。RSIBLINGS( )能获得与当前粒度相同的右兄弟集合。而SUMRANGE()刚好是计算一个集合在某个指标上的累计值。而在旬粒度上求月累计则只需SUMRANGE( )计算旬兄弟累计可得。4.1.7. IND_PROD_R_Q_SUM 意义:季累计。参考3.4累计指标 Formulas规则:/ISGEN(TIME,6)判断是否是天粒度,如果是天粒度,则运用下面的规则:CURRMBR(TIME)返回当前计算在时间维上的成员,因为已经判断出是天粒度,则它返回的是某一天的成员名称。使用R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论