沿维度层级逐层计算成员的上卷汇总
CalcRollUp(Member_Expression, [Distance])
Member_Expression -> 数据类型:Member 维度成员。 Distance -> 数据类型:Number 可选,表示从指定的维度成员开始往下(往叶子节点的方向)的距离。默认值为-1,代表从叶子节点逐层汇总。
返回值数据类型: 无返回值
CalcRollUp用于计算成员的上卷汇总。可将指定成员按照维度树形结构从下层开始进行逐层上卷汇总,通常用于手动汇总一些非自动汇总的场景,如列作用实体类,未开启累计数自动计算时的期间类,科目成员勾选了父级节点可写等。
我们以下图为例来解释CalcRollUp函数的用法。 某项目实体维度如下,第一级为总部TotalEntity,总部下设三个大区Region,每个大区下有数量不同的部门,某些部门下设置了几个小组,但另一些部门已经是最末级。 因为财务模型配置了Entity列作用为实体类,所以在Entity维度上所有父级节点都是非自动汇总并且可以写数的。此时如果在某些场景需要按照Entity做手动的上卷汇总,则可以使用CalcRollUp执行函数,将Entity的成员TotalEntity下的所有节点按照树形结构和比重层层上卷汇总,并将汇总结果写入到对应父级成员。 使用CalcRollUp函数时,需要将待汇总的维度成员放入CalcRollUp函数的入参中,同时其他所有维度需要放入scope范围定义语句中。
Use Cube_test;
Scope([Scenario].[Actual],[Version].[Version1],[Year].[2022], Base([Period].[#root]),Base([Account].[#root]));
CalcRollUp([Entity].[TotalEntity]);
End Scope;
这是CalcRollUp函数最常见的用法,不传入Distance参数即表示从维度树形结构的叶子节点开始,逐层向上汇总。此过程中会计算TotalEntity及其下面所有的父级节点的汇总值,具体计算过程是:
将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。
将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。
将Region01,Region02和Region03按照比重汇总至TotalEntity。
在上面的计算过程中,如果中间层级的非叶子节点本身存在数据,也会被下层的汇总值覆写。但对于某些特定的科目或场景,父级节点的数值不等于其子集成员的汇总。比如在某个特殊口径下,部门级别的数据不等于其下小组的汇总值,而是独立填报的数值。此时就需要用到Distance参数,指定上卷计算开始的层级。
Use Cube_test;
Scope([Scenario].[Special],[Version].[Version1],[Year].[2022], Base([Period].[#root]),Base([Account].[#root]));
CalcRollUp([Entity].[TotalEntity], 2);
End Scope;
Distance2表示从TotalEntity往下2级开始,向上汇总,此时计算过程是这样的:
将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。
将Region01,Region02和Region03按照比重汇总至TotalEntity。
需要注意,距离0代表着成员本身,由本身汇总至本身的计算是没有意义的,因此CalcRollUp([Entity].[TotalEntity], 0)的写法将不会进行实际的计算。
在CalcRollUp计算过程中,不会区分维度成员是否是共享成员,而是按照维度成员的唯一ID进行上卷汇总。 如下例,如果将Region03节点共享至Dep0101下。
如果此时财务模型中只有所有的末级节点有数据,即GroupA,GroupB,GroupC,GroupD有数据,其他节点均为空值。
Use Cube_test;
Scope([Scenario].[Actual],[Version].[Version1],[Year].[2022], Base([Period].[#root]),Base([Account].[#root]));
CalcRollUp([Entity].[TotalEntity]);
End Scope;
现使用CalcRollUp函数,并且不传入Distance参数,则计算顺序如下:
将GroupC和GroupD按照比重汇总至Dep0301。
将Dep0301按照比重汇总至Region03。
将Region03按照比重汇总至Dep0101,将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。
将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。
将Region01,Region02和Region03按照比重汇总至TotalEntity。
可以看到,在这个过程中,Dep0301和Region03因为共享节点而被多次计算。但因为计算逻辑一致,所以最终结果没有歧义。
但是,在有整棵树被共享,并且传入了Distance参数的某些场景下,需要注意一下CalcRollUp的计算过程。
Use Cube_test;
Scope([Scenario].[Special],[Version].[Version1],[Year].[2022], Base([Period].[#root]),Base([Account].[#root]));
CalcRollUp([Entity].[TotalEntity], 3);
End Scope;
此时,从TotalEntity往下3级开始,向上汇总,计算过程如下:
将Region03按照比重汇总至Dep0101(此时Region03为空值),将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。
将Dep0101和Dep0102按照比重汇总至Region01(此时Dep0101为空值),将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。
将Region01,Region02和Region03按照比重汇总至TotalEntity。
因为Region03初始状态为空值,如果您的预期是Dep0101等于GroupC和GroupD的汇总值,则计算结果可能会与您的预期不一致,此场景下,需要分步计算,先计算一下CalcRollUp([Entity].[Region03])然后再计算CalcRollUp([Entity].[TotalEntity], 3)。
特殊说明: 列作用值类的转换逻辑特殊,使用CalcRollUp函数可能引起歧义,因此列作用有值类的财务模型不支持使用CalcRollUp函数。
回到顶部
咨询热线