定义计算成员
计算成员是基于多维数据集数据、算术运算符、数字和函数的组合而定义的维度或度量值组成员。例如,可以创建用于计算多维数据集中的两个物理度量值之和的计算成员。计算成员定义将存储在多维数据集中,但它们的值将在查询时计算。
若要创建计算成员,请在多维数据集设计器的**“计算”选项卡上使用“新建计算成员”命令。您可以在包括度量值维度在内的任意维度中创建计算成员。还可以将计算成员放在“计算属性”**对话框的显示文件夹中。有关详细信息,请参阅计算、定义计算和创建计算成员。
在此主题的任务中,将定义计算度量值,以便让用户查看 Internet 销售、分销商销售和所有销售的毛利润率百分比和销售率。
定义聚合物理度量值的计算
定义聚合物理度量值的计算
打开 Analysis Services Tutorial 多维数据集的多维数据集设计器,然后单击**“计算”**选项卡。
注意**“计算表达式”窗格和“脚本组织程序”**窗格中的默认 CALCULATE 命令。此命令指定多维数据集中的度量值应该根据其 AggregateFunction 属性所指定的值进行聚合。度量值通常会求和,但也可能计数或按其他某种方式进行聚合。
下图显示了多维数据集设计器的**“计算”**选项卡。
在**“计算”选项卡的工具栏上,单击“新建计算成员”**。
新窗体将出现在**“计算表达式”窗格中,您可以在其中定义此新计算成员的属性。新成员还会出现在“脚本组织程序”**窗格中。
下图显示了在单击**“新建计算成员”时出现在“计算表达式”**窗格中的窗体。
在**“名称”**框中,将计算度量值的名称更改为 [Total Sales Amount]。
如果计算成员的名称包含空格,则该计算成员名称必须放在方括号中。
注意,在**“父层次结构”列表中,默认情况下,将在“度量值”**维度中创建新的计算成员。通常,度量值维度中的计算成员也称为计算度量值。
在**“计算”选项卡的“计算工具”窗格中的“元数据”选项卡上,展开“度量值”,再展开“Internet 销售”后,可以查看“Internet 销售”**度量值组的元数据。
可以将元数据元素从**“计算工具”窗格拖到“表达式”框中,再添加运算符和其他元素,以便创建多维表达式 (MDX)。或者,可以直接在“表达式”**框中键入 MDX 表达式。
注意 如果无法在“计算工具”窗格中查看任何元数据,请在工具栏上单击“重新连接”。如果该操作失败,则可能必须处理多维数据集,或启动 Analysis Services 实例。
将**“Internet 销售额”从“计算工具”窗格中的“元数据”选项卡拖到“计算表达式”窗格中的“表达式”**框中。
在**“表达式”框中,在“[度量值].[Internet 销售额]”**的后面键入加号 (+)。
在**“计算工具”窗格中的“元数据”选项卡上,展开“分销商销售”,再将“分销商销售额”拖到“计算表达式”窗格中的“表达式”**框中加号 (+) 的后面。
在**“格式字符串”列表中,选择“货币”**。
在**“非空行为”列表中,选中“Internet 销售额”和“分销商销售额”复选框,再单击“确定”**。
在**“非空行为”列表中指定的度量值将用于解决 MDX 中的 NON EMPTY 查询。在“非空行为”列表中指定一个或多个度量值时,如果所有指定的度量值为空,Analysis Services 将把计算成员作为空对待。如果“非空行为”**属性是空白,Analysis Services 必须对计算成员本身进行计算,才能确定成员是否为空。
下图显示了用您在前面的步骤中所指定的设置来填充的**“计算表达式”**窗格。
在**“计算”选项卡的工具栏上,单击“脚本视图”,在“计算表达式”**窗格中检查计算脚本。
注意,新的计算将添加到初始 CALCULATE 表达式中;将以分号分隔每个单独的计算。另外注意,在计算脚本的开始位置将出现注释。在计算组的计算脚本中添加注释是好的做法,这样可以帮助您和其他开发人员理解复杂的计算脚本。
在计算脚本中 Calculate; 命令之后和新添加的计算脚本之前添加新行,然后在脚本中独立的一行上添加以下文本:
/* Calculations to aggregate Internet Sales and Reseller Sales measures */
下图显示在教程的此位置应当出现在**“计算表达式”**窗格中的计算脚本。
在**“计算”选项卡的工具栏上,单击“窗体视图”,验证在“脚本组织程序”窗格中选中的“[总销售额]”,再单击“新建计算成员”**。
将这个新计算成员的名称更改为 [Total Product Cost],然后在**“表达式”**框中创建以下表达式:
[Measures].[Internet Sales-Total Product Cost] + [Measures].[Reseller Sales-Total Product Cost]
在**“格式字符串”列表中,选择“货币”**。
在**“非空行为”列表中,选中“Internet 销售-总产品成本”和“分销商销售-总产品成本”的复选框,然后单击“确定”**。
现在,您已经定义了两个计算成员,它们都显示在**“脚本组织程序”窗格中。这些计算成员可以由随后在计算脚本中定义的其他计算来使用。通过在“脚本组织程序”窗格中选择计算成员,可以查看任何计算成员的定义;计算成员的定义将出现在窗体视图内的“计算表达式”窗格中。直到已部署新定义的计算成员后,这些对象才会出现在“计算工具”**窗格中。计算不需要处理。
定义毛利润率计算
定义毛利润率计算
验证已在**“脚本组织程序”窗格中选中的[总产品成本],然后在“计算”选项卡的工具栏上单击“新建计算成员”**。
在**“名称”**框中,将此新计算度量值的名称为 [Internet GPM]。
在**“表达式”**框中,创建以下 MDX 表达式:
([Measures].[Internet Sales-Sales Amount] - [Measures].[Internet Sales-Total Product Cost]) / [Measures].[Internet Sales-Sales Amount]
在**“格式字符串”列表中,选择“百分比”**。
在**“非空行为”列表中,选中“Internet 销售额”复选框,再单击“确定”**。
在**“计算”选项卡的工具栏上,单击“新建计算成员”**。
在**“名称”**框中,将此新计算度量值的名称更改为 [Reseller GPM]。
在**“表达式”**框中,创建以下 MDX 表达式:
([Measures].[Reseller Sales-Sales Amount] - [Measures].[Reseller Sales-Total Product Cost]) / [Measures].[Reseller Sales-Sales Amount]
在**“格式字符串”列表中,选择“百分比”**。
在**“非空行为”列表中,选中“分销商销售额”复选框,再单击“确定”**。
在**“计算”选项卡的工具栏上,单击“新建计算成员”**。
在**“名称”**框中,将此计算度量值的名称更改为 [Total GPM]。
在**“表达式”**框中,创建以下 MDX 表达式:
([Measures].[Total Sales Amount] - [Measures].[Total Product Cost]) / [Measures].[Total Sales Amount]
注意,此计算成员引用了其他计算成员。由于此计算成员将在它所引用的计算成员之后进行计算,所以这是有效的计算成员。
在**“格式字符串”列表中,选择“百分比”**。
在**“非空行为”列表中,选中“Internet 销售额”和“分销商销售额”复选框,再单击“确定”**。
在**“计算”选项卡的工具栏上,单击“脚本视图”**并检查刚才添加到计算脚本中的三个计算。
在计算脚本中紧靠 [Internet GPM] 计算的前面添加新行,然后在脚本中独立的一行上添加以下文本:
/* Calculations to calculate gross profit margin */
下图显示了有三个新计算的**“表达式”**窗格。
定义总计计算的百分比
定义总计计算的百分比
在**“计算”选项卡的工具栏上,单击“窗体视图”**。
在**“脚本组织程序”窗格中,选择[总 GPM],再单击“计算”选项卡的“新建计算成员”**工具栏。
通过在单击**“新建计算成员”之前单击“脚本组织程序”窗格中最后一个计算成员,可以保证新计算成员将输入到脚本的末尾。脚本按它们出现在“脚本组织程序”**窗格中的顺序执行。
将此新计算成员的名称更改为 [Internet Sales Ratio to All Products]。
在**“表达式”**框中键入以下表达式:
Case When IsEmpty( [Measures].[Internet Sales-Sales Amount] ) Then 0 Else ( [Product].[Product Categories].CurrentMember, [Measures].[Internet Sales-Sales Amount]) / ( [Product].[Product Categories].[(All)].[All], [Measures].[Internet Sales-Sales Amount] ) End
此 MDX 表达式将计算每个产品在总计 Internet 销售额中所占的比例。Case 语句与 IS EMPTY 函数一起确保当产品没有销售额时不会发生被零除错误。
在**“格式字符串”列表中,选择“百分比”**。
在**“非空行为”列表中,选中“Internet 销售额”复选框,再单击“确定”**。
在**“计算”选项卡的工具栏上,单击“新建计算成员”**。
将此计算成员的名称更改为 [Reseller Sales Ratio to All Products]。
在**“表达式”**框中键入以下表达式:
Case When IsEmpty( [Measures].[Reseller Sales-Sales Amount] ) Then 0 Else ( [Product].[Product Categories].CurrentMember, [Measures].[Reseller Sales-Sales Amount]) / ( [Product].[Product Categories].[(All)].[All], [Measures].[Reseller Sales-Sales Amount] ) End
在**“格式字符串”列表中,选择“百分比”**。
在**“非空行为”列表中,选中“分销商销售额”复选框,再单击“确定”**。
在**“计算”选项卡的工具栏上,单击“新建计算成员”**。
将此计算成员的名称更改为 [Total Sales Ratio to All Products]。
在**“表达式”**框中键入以下表达式:
Case When IsEmpty( [Measures].[Total Sales Amount] ) Then 0 Else ( [Product].[Product Categories].CurrentMember, [Measures].[Total Sales Amount]) / ( [Product].[Product Categories].[(All)].[All], [Measures].[Total Sales Amount] ) End
在**“格式字符串”列表中,选择“百分比”**。
在**“非空行为”列表中,选中“Internet 销售额”和“分销商销售额”复选框,再单击“确定”**。
在**“计算”选项卡的工具栏上,单击“脚本视图”**,再检查刚才添加到计算脚本中的三个计算。
在计算脚本中紧靠 **[所有产品的 Internet 销售额比率]**计算之前添加新行,然后在脚本中独立的行上添加以下文本:
/* Calculations to calculate percentage of product to total product sales */
现在已经定义了八个计算成员的总计,打开“窗体”视图时,这些成员显示在**“脚本组织程序”**窗格中。
浏览新计算成员
浏览新计算成员
在 Business Intelligence Development Studio 的**“生成”菜单上,单击“部署 Analysis Services 教程”**。
部署已经成功完成后,切换到**“浏览器”选项卡,并单击“重新连接”,然后从“数据”**窗格中删除所有层次结构和度量值。
在**“元数据”窗格中,展开“度量值”**以查看度量值维度中的新计算成员。
将**“总销售额”、“Internet 销售额”和“分销商销售额”**度量值添加到数据区域,然后检查结果。
注意,**“总销售额”度量值是“Internet 销售额”度量值与“分销商销售额”**度量值之和。
将**“产品类别”用户定义层次结构添加到“数据”窗格的筛选区域中,再按“山地自行车”**对该数据进行筛选。
注意,**“总销售额”度量值是基于“山地自行车”的“Internet 销售额”和“分销商销售额”度量值对“山地自行车”**类别的产品销售额进行计算而产生的。
将 Date.Calendar Date 用户定义层次结构添加到行区域,然后查看结果。
注意,每个日历年的**“总销售额”度量值是基于“山地自行车”的“Internet 销售额”和“分销商销售额”度量值对“山地自行车”**类别的产品销售额进行计算而产生的。
将**“总 GPM”、Internet GPM 和“分销商 GPM”**度量值添加到数据区域,然后检查结果。
注意,分销商销售的毛利润率要比 Internet 销售低很多。另外注意,山地车销售的毛利润率正在随时间推移而增长,如下图所示。
将**“所有产品的总销售额比率”、“所有产品的 Internet 销售额比率”和“所有产品的分销商销售额比率”**度量值添加到数据区域。
注意,Internet 销售的山地车销售额在所有产品中所占的比率随时间推移而增长,但在分销商那里却在随时间推移而减少。另外注意,通过分销商销售的山地车销售额在所有产品中所占的比率低于通过 Internet 销售完成的该比率。
将筛选器从**“山地自行车”更改为“自行车”**,然后检查结果。
注意,通过分销商销售的所有自行车的毛利润率都是负数,这是因为观光自行车和道路自行车都在亏损销售。
将筛选器更改为**“附件”**,然后检查结果。
注意,附件的销售正在随时间而增长,但这些销售只构成总销售额的一小部分。另外注意,附件销售的毛利润率比自行车还高。
依次展开 CY 2004、H2 CY 2004 以及 Q3 CY 2004。
注意,此多维数据集中 2004 年 7 月之后没有 Internet 销售额,并且 2004 年 6 月之后没有分销商销售额。这些销售值还没有从源系统添加到 Adventure Works DW 数据库。