单元格计算顺序
Essbase 计算每个数据块中的单元的顺序取决于您配置数据库的方式。
每个数据块都包含其稀疏维成员的唯一组合的所有密集维成员值。每个数据值都包含在数据块的单元格中。
您如何配置数据库可确定在每个块内的密集维成员的计算顺序以及表示稀疏维成员的块的计算顺序。
请参见以下示例:
单元格计算顺序:示例 1
在本例中,这是最简单的情况,以下条件为真:
-
没有维有时间或帐户标记。
-
启用用于合并 #MISSING 值的设置。
-
市场和年份是密集维度。
Essbase 按在数据库大纲中定义密集维的顺序计算密集维。假设“Year(年份)”维在“Market(市场)”维之前放置在数据库大纲中,并且首先计算该维。
以下网格显示分片(数据块中单元格的子集)。在网格中,时段单元格的计算顺序由数字 1 - 6 表示。
表 19-3 计算顺序示例 1:输入单元格和计算的单元格
| 年度市场 | 纽约 | 马萨诸塞州 | East |
|---|---|---|---|
| Jan | 112345 | 68754 | 3 |
| Feb | 135788 | 75643 | 4 |
| 三月 | 112234 | 93456 | 5 |
| Qtr1 | 1 | 2 | 6 |
数据值已加载到以下输入单元格中:
-
Jan -> 纽约
-
二月 -> 纽约
-
Mar -> 纽约
-
Jan -> 马萨诸塞州
-
Feb -> 马萨诸塞州
-
Mar -> 马萨诸塞州
Essbase 按以下顺序计算单元格。
-
Qtr1 -> 纽约
-
Qtr1 -> 马萨诸塞州
-
Jan -> 东部
-
二月 -> 东部
-
三月 -> 东部
-
Q1 -> 东部
Qtr1 -> East 有多个合并路径,可以在市场或年份进行合并。当合并到市场时,它是 Qtr1-> 纽约和 Qtr1-> 马萨诸塞州的合并。在年度合并时,它是“Jan(一月)”>“East(东部)”、“Feb(二月)”>“East(东部)”和“Mar(三月)”>“East(东部)”的合并。
Essbase 知道 Qtr1 -> East 有多个合并路径。因此,它仅通过合并 Qtr1 的值来计算 Qtr1 -> East 一次,并使用最后计算的维的合并路径(在本例中为“市场”维),如下所示。
表 19-4 计算顺序示例 1:结果
| 年度市场 | 纽约 | 马萨诸塞州 | East |
|---|---|---|---|
| Jan | 112345 | 68754 | 181,099 |
| Feb | 135788 | 75643 | 211,431 |
| 三月 | 112234 | 93456 | 205,690 |
| Qtr1 | 360,367 | 237,853 | 598,220 |
根据计算顺序,如果在 Qtr1 上放置成员公式,则 Essbase 在计算 Qtr1 -> East 时会忽略该公式。如果将成员公式放在东部,则当 Essbase 合并 Qtr1 -> 市场东部时,将计算公式。
如果需要,可以使用计算脚本按您选择的顺序计算维。
单元格计算顺序:示例 2
在本例中,以下条件为真:
-
没有维有时间或帐户标记。
-
合并 #MISSING 值的设置处于关闭状态(默认值)。
-
市场和年份是密集维度。
Essbase 按在数据库大纲中定义密集维的顺序计算密集维。假设“Year(年份)”维在“Market(市场)”维之前放置在数据库大纲中,并且首先计算该维。
以下网格显示分片(数据块中单元格的子集)。在网格中,时段单元格的计算顺序由数字 1 - 7 表示。
表 19-5 计算顺序示例 2:输入单元格和计算的单元格
| 年度市场 | 纽约 | 马萨诸塞州 | East |
|---|---|---|---|
| Jan | 112345 | 68754 | 4 |
| Feb | 135788 | 75643 | 5 |
| 三月 | 112234 | 93456 | 6 |
| Qtr1 | 1 | 2 | 3/7 |
数据值已加载到以下输入单元格中:
-
Jan -> 纽约
-
二月 -> 纽约
-
Mar -> 纽约
-
Jan -> 马萨诸塞州
-
Feb -> 马萨诸塞州
-
Mar -> 马萨诸塞州
Essbase 计算纽约、马萨诸塞州和东部以及 1 月、2 月和 3 月的 Qtr1 单元格。
-
Qtr1 -> 纽约
-
Qtr1 -> 马萨诸塞州
-
Q1 -> 东部
-
Jan -> 东部
-
二月 -> 东部
-
三月 -> 东部
-
Q1 -> 东部
Qtr1 -> East 是在年份和市场合并路径上计算的。首先,Qtr1 -> East 被计算为 Qtr1 -> New York 和 Qtr1 -> Massachusetts 的合并。其次,Qtr1 -> East 的计算公式为:Jan -> East、Feb -> East 和 Mar -> East。
结果与例如 1 的结果相同。但是,Qtr1 -> East 已计算两次。当需要在父级别加载数据时,此事实非常重要。
根据计算顺序,如果在 Qtr1 上放置成员公式,则当 Essbase 合并 Qtr1 -> 市场东部时,会覆盖其结果。如果将成员公式放在“东部”上,则结果将保留,因为“市场”是最后计算的。
表 19-6 计算顺序示例 2:结果
| 年度市场 | 纽约 | 马萨诸塞州 | East |
|---|---|---|---|
| Jan | 112345 | 68754 | 181,099 |
| Feb | 135788 | 75643 | 211,431 |
| 三月 | 112234 | 93456 | 205,690 |
| Qtr1 | 360,367 | 237,853 | 598,220 |
单元格计算顺序:示例 3
在此示例中,请考虑密集的存储维中的数据片段。数据库的配置确定维的顺序定义计算顺序。将通过两个合并路径来计算块。
在本例中,以下条件为真:
-
没有维有时间或帐户标记。
-
合并 #MISSING 值的设置处于关闭状态(默认值)。
-
已在父级别加载数据值。
-
市场和年份是密集维度。
Essbase 按在数据库大纲中定义密集维的顺序计算密集维。假设“Year(年份)”维在“Market(市场)”维之前放置在数据库大纲中,并且首先计算该维。
以下网格显示需要计算的切片(数据块中单元格的子集)。
表 19-7 计算顺序示例 3:输入单元格和 #MISSING 值
| 年度市场 | 纽约 | 马萨诸塞州 | East |
|---|---|---|---|
| Jan | #MISSING | #MISSING | 181,099 |
| Feb | #MISSING | #MISSING | 211,431 |
| 三月 | #MISSING | #MISSING | 205,690 |
| Qtr1 | #MISSING | #MISSING |
单元格的计算顺序与单元格计算顺序:示例 2 中的计算顺序相同。Qtr1 -> East 是在年份和市场合并路径上计算的。
由于关闭了用于合并 #MISSING 值的设置,因此 Essbase 不会合并 #MISSING 值。因此,在父级别加载的数据不会被其下方的 #MISSING 值覆盖。
但是,如果任何子数据值不是 #MISSING,则合并这些值并覆盖父值。例如,如果 Jan -> New York 包含 50000.00,则此值将覆盖在父级别加载的值。
Essbase 必须计算两次 Qtr1 -> East 单元格,以确保为单元格计算值。如果仅根据最后一个合并路径计算 Qtr1 -> East,则结果为 #MISSING,这不是所需结果。
结果显示, Essbase 首先通过合并“Jan(一月)”>“East(东部)”>“Feb(二月)”>“East(东部)”和“Mar(三月)”>“East(东部)”来正确计算“Qtr1”>“East(东部)”单元格,然后根据“Market(市场)”合并路径进行计算。但是,它不会合并 Qtr1 -> New York 和 Qtr1 -> Massachusetts 中的 #MISSING 值;因此,Qtr1 -> East 中的值不会被覆盖。
表 19-8 计算顺序示例 3:结果
| 年度市场 | 纽约 | 马萨诸塞州 | East |
|---|---|---|---|
| Jan | #MISSING | #MISSING | 181,099 |
| Feb | #MISSING | #MISSING | 211,431 |
| 三月 | #MISSING | #MISSING | 205,690 |
| Qtr1 | #MISSING | #MISSING | 598,220 |
单元格计算顺序:示例 4
在此示例中,请考虑存储维中的数据片。数据库的配置决定了块的计算顺序。
在本例中,以下条件为真:
-
“年”维标记为“时间”。
-
“度量”维标记为“帐户”。
Essbase 首先计算标记为“帐户”的维,然后计算标记为“时间”的维。因此,在本例中,度量是在年份之前计算的。
-
合并 #MISSING 值的设置处于关闭状态(默认值)。
-
已在季度(级别 1)加载“市场营销”、“薪资”和“其他费用”值。
下图显示了 Sample Basic 数据库中度量维的 Profit 分支。此示例假定总费用已存储(不是动态计算成员)。
图 19-9 度量维的利润分支

由于没有公式且 #MISSING 不合并,因此不会覆盖上层值。计算两次具有两个合并路径(非 0 级度量)的数据值。
以下网格显示分片(数据块中单元格的子集)。在栅格中,时段单元格的计算顺序由数字 1 - 17 表示。
表 19-9 计算顺序示例 4:输入单元格、#MISSING 值和计算的单元格
| 衡量标准/年度 | Jan | Feb | 三月 | Qtr1 |
|---|---|---|---|---|
| 销售 | 31538 | 32069 | 32213 | 13 |
| COGS | 14160 | 14307 | 14410 | 14 |
| 旁注 | 1 | 4 | 7 | 10/15 |
| 市场营销 | #MISSING | #MISSING | #MISSING | 15839 |
| 薪资 | #MISSING | #MISSING | #MISSING | 12168 |
| Misc | #MISSING | #MISSING | #MISSING | 233 |
| 总费用 | 2 | 5 | 8 | 11/16 |
| Profit | 3 | 6 | 9 | 12/17 |
以下单元格具有多个合并路径:
-
利润 -> Qtr1
-
总费用 -> 第 1 季度
-
利润 -> 季度 1
由于关闭了用于合并 #MISSING 值的设置,因此 Essbase 不会合并 #MISSING 值。在父级别加载的任何数据不会被 #MISSING 值覆盖,并且 Essbase 会计算具有多个合并路径的单元格两次。
根据计算顺序,如果将公式置于“毛利”上,则其结果将被 Qtr1 上的合并覆盖。
结果如下所示:
表 19-10 计算顺序示例 4:结果
| 衡量标准/年度 | Jan | Feb | 三月 | Qtr1 |
|---|---|---|---|---|
| 销售 | 31538 | 32069 | 32213 | 95,820 |
| COGS | 14160 | 14307 | 14410 | 42,877 |
| 旁注 | 17,378 | 17,762 | 17,803 | 52,943 |
| 市场营销 | #MISSING | #MISSING | #MISSING | 15839 |
| 薪资 | #MISSING | #MISSING | #MISSING | 12168 |
| Misc | #MISSING | #MISSING | #MISSING | 233 |
| 总费用 | 28,240 | |||
| Profit | 17,378 | 17,762 | 17,803 | 12/17 |
密集维上的公式的单元格计算顺序
在密集维成员上放置公式时,请仔细考虑单元格计算顺序。如前面的示例所示,上次计算的维将覆盖具有多个合并路径的单元格以前的单元格计算。
数据块中的单元格计算顺序不受成员公式的影响。当 Essbase 在数据块中遇到公式时,它会锁定任何其他必需的数据块,计算公式,然后继续进行数据块计算。
如果需要,可以使用计算脚本更改维的计算顺序。请参阅开发块存储多维数据集的计算脚本和开发块存储多维数据集的公式。