全部文档
文档中心财务模型多维表达式MDXMDX函数执行函数CalcRollUp函数

CalcRollUp函数

沿维度层级逐层计算成员的上卷汇总

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及其下面所有的父级节点的汇总值,具体计算过程是:

  1. 将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。

  2. 将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。

  3. 将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级开始,向上汇总,此时计算过程是这样的:

  1. 将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。

  2. 将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参数,则计算顺序如下:

  1. 将GroupC和GroupD按照比重汇总至Dep0301。

  2. 将Dep0301按照比重汇总至Region03。

  3. 将Region03按照比重汇总至Dep0101,将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。

  4. 将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。

  5. 将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级开始,向上汇总,计算过程如下:

  1. 将Region03按照比重汇总至Dep0101(此时Region03为空值),将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。

  2. 将Dep0101和Dep0102按照比重汇总至Region01(此时Dep0101为空值),将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。

  3. 将Region01,Region02和Region03按照比重汇总至TotalEntity。

因为Region03初始状态为空值,如果您的预期是Dep0101等于GroupC和GroupD的汇总值,则计算结果可能会与您的预期不一致,此场景下,需要分步计算,先计算一下CalcRollUp([Entity].[Region03])然后再计算CalcRollUp([Entity].[TotalEntity], 3)。

特殊说明: 列作用值类的转换逻辑特殊,使用CalcRollUp函数可能引起歧义,因此列作用有值类的财务模型不支持使用CalcRollUp函数。

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send