现在的位置: 首页 > 综合 > 正文

表达式 (MDX)

2014年08月29日 ⁄ 综合 ⁄ 共 4228字 ⁄ 字号 评论关闭

表达式 (MDX)

表达式是标识符、值和运算符的组合,Microsoft SQL Server 2005 Analysis Services (SSAS) 可以通过计算表达式来获得结果。访问或更改数据时,可在多个不同的位置使用数据。例如,可以将表达式用作查询要检索的数据的一部分,或用作查找满足一组条件的数据的搜索条件。
简单表达式和复杂表达式简单表达式和复杂表达式

在 MDX 中,表达式可以是简单的,也可以是复杂的:

简单表达式可以是下列几种表达式之一:
常量
    在 MDX 中,常量是表示单个特定值的符号。字符串、数字和日期值可以呈现为常量。与数值常量不同,字符串和日期常量必须用单引号 (') 字符分隔开。

标量函数
    在 MDX 中,标量函数返回计算上下文内的单个值。此区别对于理解 MDX 如何解析标量函数很重要,因为不是对单个数据元素计算大多数 MDX 表达式、语句和脚本,而是重复地对一组数据元素(如单元或成员)进行计算。但在计算标量函数时,函数通常查看单个数据元素。

对象标识符
    由于多维数据的本质,因此 MDX 是面向对象的。在 MDX 中,对象标识符被视为简单表达式。有关标识符的详细信息,请参阅标识符 (MDX)。

变量
    MDX 脚本可以包含用户定义变量以保留信息。变量只能用在表达式中,不能替换关键字或对象标识符。
可以从用运算符联接的这些实体的组合生成复杂表达式。
表达式结果
对于由单个常量、变量、标量函数或列名组成的简单表达式,其数据类型、排序规则、精度、小数位数和值就是它所引用的元素的数据类型、排序规则、精度、小数位数和值。因为 MDX 仅直接支持 OLE VARIANT 数据类型,所以使用简单表达式时不会发生强制。
对于复杂表达式,当使用两个或多个不同数据类型的简单表达式时,可以发生强制。
表达式示例
表达式还可以是计算,例如 [Measures].[Discount Amount] * 1.5。下面的示例说明如何在 MDX SELECT 语句使用计算来定义成员:

WITH
   MEMBER [Measures].[Special Discount] AS
   [Measures].[Discount Amount] * 1.5
SELECT
   [Measures].[Special Discount] on COLUMNS,
   NON EMPTY [Product].[Product].MEMBERS  ON Rows
FROM [Adventure Works]

                        使用多维数据集表达式和子多维数据集表达式
通常将多维数据集表达式和子多维数据集表达式与多维表达式 (MDX) 语句一起使用,以定义、操作或检索多维数据集或子多维数据集中的数据。
多维数据集表达式
多维数据集表达式包含多维数据集标识符或 CURRENTCUBE 关键字。许多 MDX 语句使用 CURRENTCUBE 关键字标识当前多维数据集上下文,而不要求使用多维数据集标识符。
多维数据集标识符显示为 Cube_Name。
子多维数据集表达式
子多维数据集表达式可以包含子多维数据集标识符、子多维数据集函数或返回子多维数据集的 MDX 语句。例如,MDX SELECT 语句将返回子多维数据集,并且可在允许使用子多维数据集表达式的地方使用。
子多维数据集标识符显示为 Subcube_Name。

                        使用成员表达式
成员表达式包含成员标识符、成员函数或可以转换为成员的表达式。
成员标识符至少有两个标识符组成:维度名称以及成员名称或成员键。成员标识符的格式如下:
Dimension_Name.[Hierarchy_Name.] [[{Member_Name | &Member_Key}.]... ] {Member_Name | &Member_Key}

如果成员的路径涉及维度的默认层次结构以外的层次结构,则可以指定层次结构名称。如果成员显示在层次结构最上层以外的任意层,则可以指定一个或多个父成员。

                        使用元组表达式

元组由多维数据集内包含的每个维度的一个成员组成。因此,一个元组唯一标识多维数据集内的一个单元。
注意:引用一个或多个无效成员的元组称为“空元组”。
元组标识符的完整表达式由一个或多个用括号括起的显式指定的成员组成:
(Member_expression [ ,Member_expression ... ] )
元组可以是完全限定的,可以包含多个隐式成员,也可以只包含一个成员。
元组和隐式成员
显式指定多维数据集内包含的每个维度的一个成员的元组称为“完全限定元组”。但是,元组没有必要是完全限定的。
元组内没有显式引用的任何维度都被隐式引用。隐式引用的维度的成员取决于维度的结构:
    * 如果隐式引用的维度有默认成员,则将默认成员添加到元组中。
    * 如果隐式引用的维度没有默认成员,则使用默认层次结构的 (All) 成员。
    * 如果隐式引用的维度没有默认成员,且默认层次结构没有 (All) 成员,则使用默认层次结构的最上层的第一个成员。
例如,一个多维数据集有两个维度,分别为 Product 和 Customer。这两个维度都有一个属性,但它们都没有定义的默认成员。对于这个多维数据集,可以定义以下元组:
([Measures].[Unit Sales])
上面的元组等同于以下元组:??????
([Measures].[Unit Sales], [Product].[Product].[All Products], [Customer].[Customer].[All Customers])  

一个成员的元组一个成员的元组
如果元组表达式仅有一个成员,MDX 将把该成员转换为单成员元组,以计算该表达式。换言之,使用成员表达式 [Measures].[TestMeasure](而不是元组表达式)与使用元组表达式 ( [Measures].[TestMeasure] ). 的效果相同。
问题:
什么是隐式成员,什么是显式成员????

                            使用集表达式
一个集由零个或多个元组构成。(不包含任何元组的集称为“空集”。)
一个集的完整表达式由零个或多个显式指定的元组构成,各元组放在大括号中:
{ [ { Tuple_expression | Member_expression } [ , { Tuple_expression | Member_expression } ] ... ] }
集表达式中指定的成员表达式将被转换为由一个成员构成的元组表达式。

                            使用标量表达式
在多维表达式 (MDX) 中,标量表达式是 MDX 语法的一个元素,计算时,将在计算上下文中返回单个值。
标量表达式包括 MDX 中的字符串表达式、数值表达式和日期表达式。

                            使用空值

空值指明特定的成员、元组或单元是空的。空单元值指明在基础事实表中找不到指定单元的数据,或者指定单元的元组代表不适用于多维数据集的成员组合。
注意:虽然空值有别于零值,但是通常大多数情况下都将空值作为零处理。

以下信息适用于空值:
    * 当且仅当由函数中指定的元组标识的单元为空时,IsEmpty 函数才返回 TRUE。否则,此函数将返回 FALSE。
      注意:
      IsEmpty 函数不能确定某个成员是否为空。若要确定某个成员是否为空,请使用 IS 运算符。
    * 当空单元值是数字运算符(+、-、*、/)中任一运算符的一个操作数时,如果另一个操作数是非空值,空单元值将被作为零处理。如果两个操作数都为空,数字运算符将返回空单元值。
    * 当空单元值是字符串串联运算符 (+) 的一个操作数时,如果另一个操作数是非空值,空单元值将被作为空字符串处理。如果两个操作数都为空,字符串串联运算符将返回空单元值。
    * 当空单元值是比较运算符(=.<>、>=、<=、>、<)中任一运算符的操作数时,根据另一个操作数的数据类型是数字还是字符串,分别将空单元值作为零或空字符串处理。如果两个操作数都为空,则两个操作数均作为零处理。
    * 当对数字值进行排序时,空单元值排在与零相同的位置。在空单元值和零之间,空单元值排在零之前。
    * 当对字符串值进行排序时,空单元值排在与空字符串相同的位置。在空单元值和空字符串之间,空单元值排在空字符串之前。

处理 MDX 语句和多维数据集中的空值

在多维表达式 (MDX) 语句中,可以查找空值,然后对包含有效(即不为空)数据的单元进行某些运算。进行运算时消除空值很重要,因为如果包含空单元值,某些运算(如平均值)可能不准确。
如果空值可能存储在基础事实表数据中,而您不希望空单元值出现在多维数据集中,则应创建消除空值或将空值合并到其他某些值中的查询和数据修改语句。此外,可以使用度量值的“空值处理”选项来修改空事实,以便将空事实转换为 0、转换为空值或者在处理过程中引发错误。
空值和比较运算符空值和比较运算符
如果数据中存在空值,逻辑运算符和比较运算符有可能返回 TRUE 或 FALSE 以外的第三种结果 EMPTY。这种对三值逻辑的需要是导致许多应用程序出错的根源。下面这些表概括了引入空值比较的影响。
下表显示了对两个布尔操作数应用 AND 运算符的结果。
AND         TRUE         EMPTY     FALSE
TRUE        TRUE        FALSE        FALSE
EMPTY     FALSE        EMPTY        FALSE
FALSE        FALSE        FALSE        FALSE

下表显示了对两个布尔操作数应用 OR 运算符的结果。
OR         TRUE         FALSE
TRUE         TRUE        TRUE
EMPTY        TRUE        TRUE
FALSE        TRUE        FALSE

下表显示了 NOT 运算符如何求反或反转布尔运算符的结果。
应用了 NOT 运算符的布尔表达式     计算结果
TRUE        FALSE
EMPTY        EMPTY
FALSE        TRUE

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/anyoneking/archive/2007/06/25/1665686.aspx

抱歉!评论已关闭.