一.MDX概述
MDX(多维表达式的英文首字母缩写词)是一种语法,支持多维对象与数据的定义和操作。MDX 在很多方面与结构化查询语言 (SQL) 语法相似,但它不是 SQL 语言的扩展;事实上,MDX 所提供的一些功能也可由 SQL 提供,尽管不是那么有效或直观。
二.基本MDX查询
MDX 查询必须包含有关下列各项的信息:
l 轴的数目。最多可在 MDX 查询中指定 128 个轴。
l 要包括在 MDX 查询的各个轴上的来自各个维度的成员。
l 设置 MDX 查询上下文的多维数据集的名称。
l 来自切片器维度的成员,在该维度上对来自轴维度的成员进行数据切片
来看一个简单的例子:
SELECT
{ [Measures].[Unit Sales], [Measures].[Store Sales] } ON COLUMNS,
{ [Time].[1997], [Time].[1998] } ON ROWS
FROM Sales
WHERE ( [Store].[
具体的解释如下:
SELECT 子句决定 MDX SELECT 语句的轴维度。本 MDX 查询示例中定义了两个轴维度。
FROM 子句决定当析取数据以填充 MDX SELECT 语句的结果集时将使用哪个多维数据源。
选用的 WHERE 子句决定哪个维度或成员用作切片器维度;这将数据的析取限制于特定维度或成员。本 MDX 查询示例使用 WHERE 子句来将轴维度的数据析取限制于 Store 维度的特定成员。
MDX SELECT 语句的语法格式与 SQL 语法类似,还是有以下几个显著区别:
l MDX 语法通过用花括号({ 和 } 字符)括住元组或成员来辨别集合。有关成员、元组和集合语法的更多信息,请参见成员、元组和集合。
l MDX 查询在 SELECT 语句中最多可以有 128 个轴维度,但只有前 5 个轴有别名。轴可以用其在 MDX 查询中的顺序位置或者用其别名(如果给它指派了别名的话)来引用。在上面的 MDX 查询示例中,使用了 COLUMNS 和 ROWS 轴别名。此 MDX 查询还可以使用各个轴的顺序位置用以下方式编写:
SELECT
{ [Measures].[Unit Sales], [Measures].[Store Sales] } ON AXIS(0),
{ [Time].[1997], [Time].[1998] } ON AXIS(1)
FROM Sales
WHERE ( [Store].[
l 如同 SQL 查询一样,FROM 子句为 MDX 查询指定数据的源。然而,与 SQL 查询不同的是,MDX 查询中的 FROM 子句被限定为单个多维数据集。来自其它多维数据集的信息也可以进行检索,方法是使用 LookupCube 函数逐个值地进行。
l WHERE 子句用于描述切片器维度。如果某个维度没有作为 WHERE 子句的一部分提出,则 SQL Server Analysis Services 假定任何未指派给轴维度的维度均为切片器维度,并用其默认成员对该维度进行筛选。WHERE 子句可以为指定维度更改筛选进程,从而实现对所包含数据的精确控制。
三.成员、元组和集合
在开始创建多维表达式 (MDX) 查询之前,应当理解成员、元组和集合的定义,也要理解用于构造和引用这些元素的 MDX 语法。
1.成员
成员是代表维度中一次或多次数据出现的项。请把维度中的成员看作基础数据库中的一个或多个记录,其该列内的值归入该分类。成员是描述多维数据集中的单元数据时的最低参照层次。
例如,下面的关系图加入阴影以表示"时间.[下半年].[第三季度]"成员。
2.元组
元组用于定义来自多维数据集的数据切片;它由来自一个或多个维度的单个成员的有序集合组成。元组用于标识来自多维数据集的特定多维数据块;由来自多维数据集中各个维度的一个成员组成的元组完全描述单元值。换言之,元组是一种成员向量;请把元组看作基础数据库中的一个或多个记录,其这些列内的值归入这些分类。一系列关系图给出了元组的各种类型。
多维数据集的阴影部分表示 (时间.[下半年]) 元组。请注意该元组包括了多维数据集的一半,因为它未排除"源"或"路线"维度中的任何信息。
下面的关系图加入阴影以表现 (时间.[下半年], 路线.非陆地.航空) 元组。
3.集合
集合是零个、一个或多个元组的有序集合。集合最常用于在 MDX 查询中定义轴维度和切片器维度,并且同样可能只具有单个元组或可能在某些情况下为空。下面的示例显示具有两个元组的集合:
{ (Time.[1st half], Route.nonground.air), (Time.[2nd half], Route.nonground.sea) }
一个集合可包含同一个元组不止一次的出现。下面的集合是可接受的:
{ Time.[2nd half], Time.[2nd half] }
集合指以元组表示的一组成员组合,或指集合中的元组所代表的单元中的值,视集合使用的上下文而定。
在 MDX 语法中,元组用花括号括起来以构造集合。
注意:由单个元组组成的集合不是元组;MDX 将其解释为集合。某些 MDX 函数接受元组作为参数,而如果传递单个元组集合,则会产生错误。元组和单个元组集合不可互换。
四.轴维度和切片器维度
1.指定轴纬度的内容
轴维度决定多维结果集的边缘。多维表达式 (MDX) 使用 SELECT 子句通过将集合指派到特定轴来指定轴维度。以下信息描述在 MDX 中怎样处理这种指派。
在下面的语法示例中,每个 <axis_specification> 值定义一个轴维度。数据集中轴的个数等于多维表达式 (MDX) 查询中 <axis_specification> 值的个数。MDX 查询最多可以支持 128 个指定轴,但几乎没有 MDX 查询会用到 5 个以上的轴。
<axis_specification> 语法可分解为:
<axis_specification> ::= <set> ON <axis_name>
<axis_name> ::= COLUMNS | ROWS | PAGES | SECTIONS | CHAPTERS | AXIS(<index>)
每个轴维度与一个数字相关联:0 对应于 x 轴,1 对应于 y 轴,2 对应于 z 轴,等等。<index> 值是轴号。对于前 5 个轴,COLUMNS、ROWS、PAGES、SECTIONS 和 CHAPTERS 这几个别名可分别代替 AXIS(0)、AXIS(1)、AXIS(2)、AXIS(3) 和 AXIS(4) 使用。
注意:MDX 查询无法跳过轴。也就是说,包含一个或多个 <axis_name> 值的查询不能排除低编号轴或中间轴。例如,查询不能有 ROWS 轴而无 COLUMNS 轴,或有 COLUMNS 和 PAGES 轴而无 ROWS 轴。
然而可以指定不带轴的 SELECT 子句(即空 SELECT 子句)。这种情况下,所有维度均为切片器维度,并且 MDX 查询选择一个单元。
2.指定切片器维度的内容
切片器维度筛选多维数据。可以通过将切片器维度包含在多维表达式 (MDX) 查询的 WHERE 子句来限制所返回的数据。
假定未显式指派给轴的维度是切片器维度,并用其默认成员进行筛选。维度的默认成员可在 Analysis Manager 的"Default Member"属性中进行显式指定。该属性等同于决策支持对象 (DSO) 中的 DefaultMember 属性。如果未显式指定默认成员,如果存在"(全部)"级别,则默认成员为"全部"成员,否则为最高级别的任意成员。("全部"成员的名称不必为"全部"。)
切片器维度还可通过使用 MDX 语法的 WHERE 子句进行显式指定。WHERE 子句的语法可分解为:
[WHERE [<slicer_specification>]]
成员名 [全部] 可能在多维数据集内不唯一,因为许多维度都拥有 [全部] 级别。建议用户用维度名对该名称加以限定,使其含义明确。下面的示例示范 WHERE 子句和"全部"成员的使用:
WHERE ( [Route].[All], [Time].[1st half] )
切片器维度只可接受评估为单个元组的表达式。这并不意味着在切片器维度中只能显式声明单个元组,如下例所示:
WHERE ( [Time].[1st half], [Route].[nonground] )
如果以切片器表达式的形式提供元组集合,则 MDX 将尝试顺着集合聚合各个元组中的结果单元来评估集合。换言之,MDX 将尝试对集合使用 Aggregate 函数,用与其相关的聚合函数聚合各个度量值。下面的示例展示了使用元组集合的有效的 WHERE 子句:
WHERE { ([Time].[1st half], [Route].[nonground]), ([Time].[1st half], [Route].[ground]) }
如果«slicer_specification» 不能求解为单个元组,则将产生错误。