在 Microsoft SQL Server Analysis Services 中,多维表达式 (MDX) 脚本可以应用于整个多维数据集或多维数据集的特定部分(在脚本执行中的特定点)。 MDX 脚本可以通过使用计算传递对多维数据集中的计算采取分层方法。
注释
有关计算过程如何影响计算结果的更多信息,请参阅计算传递顺序与求解顺序的理解(MDX)。
若要控制 MDX 脚本中的计算传递、作用域和上下文,请专门使用 CACULATE 语句、 This 函数和 SCOPE 语句。
使用 CALCULATE 语句
CALCULATE 语句使用聚合数据填充多维数据集中的每个单元格。 例如,默认 MDX 脚本在脚本开头有一个 CALCULATE 语句。
有关 CALCULATE 语句的语法的详细信息,请参阅 CALCULATE 语句(MDX)。
注释
如果脚本包含包含 CALCULATE 语句的 SCOPE 语句,MDX 将在 SCOPE 语句定义的子多维数据集的上下文中计算 CALCULATE 语句,而不是针对整个多维数据集。
使用此函数
此This函数使您能够检索 MDX 脚本中的当前子立方体。 可以使用函数 This 将当前子多维数据集中的单元格值快速设置为 MDX 表达式。 通常将This函数与SCOPE语句结合使用,以在特定计算传递期间更改特定子立方体的内容。
注释
如果脚本中有一个包含This函数的SCOPE语句,MDX将在由SCOPE语句定义的子多维数据集的上下文中计算This函数,而不是针对整个多维数据集。
此函数示例
以下是一个 MDX 脚本命令示例,该示例使用 This 函数将 Adventure Works DW 2012 多维数据集的 Finance 度量值组中的 Amount 度量值,针对客户维度中 Redmond 成员的子级,提高了 10%。
/* This SCOPE statement defines the current subcube */
SCOPE([Customer].&[Redmond].MEMBERS,
[Measures].[Amount], *);
/* This expression sets the value of the Amount measure */
THIS = [Measures].[Amount] * 1.1;
END SCOPE;
有关函数语法This的详细信息,请参阅此函数(MDX)。
使用 SCOPE 语句
SCOPE 语句定义当前子多维数据集,并指定 MDX 脚本中其他 MDX 表达式和语句的范围。 MDX 在子多维数据集的上下文中计算其他 MDX 表达式和语句,包括 This 函数和 CALCULATE 语句。
SCOPE 语句是动态的,但本质上不是迭代的。 SCOPE 语句中包含的语句将执行一次,但子立方体本身可以被动态确定。 例如,你有一个名为 SampleCube 的多维数据集。 针对 SampleCube 多维数据集,应用以下 SCOPE 语句来定义子多维数据集,该子多维数据集将上下文定义为“度量值”维度中的 ALLMEMBERS:
SCOPE([Measures].ALLMEMBERS);
THIS = [Measures].ALLMEMBERS.COUNT;
END SCOPE;
在此 SCOPE 语句中,所有语句和表达式仅运行一次。
现在,业务用户针对 SampleCube 多维数据集运行以下 MDX 查询,其中包含一个名为 ExistingMeasure 的度量值:
WITH MEMBER [Measures].[NewMeasure] AS '1'
SELECT
[Measures].ALLMEMBERS ON COLUMNS,
[Customer].DEFAULTMEMBER ON ROWS
FROM
[SampleCube]
从查询返回的单元格集类似于下表中显示的输出。
| 现有措施 | [新测量] | |
|---|---|---|
| [客户]。[全部] | 2 | 2 |
查看返回的单元格集时,请注意在 MDX 脚本中的 SCOPE 语句中定义 NewMeasure 后,ExistingMeasure 值如何动态更新。
SCOPE 语句可以嵌套在另一个 SCOPE 语句中。 但是,由于 SCOPE 语句不是迭代的,所以嵌套 SCOPE 语句的主要用途是对子多维数据集进行进一步细分,以便进行特殊处理。
SCOPE 语句示例
以下 MDX 脚本示例使用 SCOPE 语句,将 Adventure Works DW 2012 示例多维数据集的 Finance 度量值组中的 Amount 度量值设定为对 Customer 维度中 Redmond 成员的子项提高 10%。 但是,另一个 SCOPE 语句将子立方体更改为包含 2002 日历年子级的 Amount 度量值。 最后,仅针对那个子多维数据集来聚合金额度量,使金额度量的聚合值在其他日历年内保持不变。
/* Calculate the entire cube first. */
CALCULATE;
/* This SCOPE statement defines the current subcube */
SCOPE([Customer].&[Redmond].MEMBERS,
[Measures].[Amount], *);
/* This expression sets the value of the Amount measure */
THIS = [Measures].[Amount] * 1.1;
END SCOPE;
有关 SCOPE 语句的语法的详细信息,请参阅 SCOPE 语句 (MDX)。