MDX主要涉及到了如下概念:
成员、成员名和成员键、计算成员、成员函数、元组、元组函数、元组和维数、集合、聚合函数、集合和维数、命名集
成员:
成员是代表维度中一次或多次数据出现的项。请把维度中的成员看作基础数据库中的一个或多个记录,其该列内的值归入该分类。成员是描述多维数据集中的单元数据时的最低参照层次。
例如,下面的关系图加入阴影以表示"时间.[下半年].[第三季度]"成员
注意“[”和“]”
成员名和成员键:
可用其成员名或其成员键引用某个成员。上一示例中用其成员名"第四季度"引用"时间"维度中的成员。但是,在具有非唯一成员名的维度中成员名可以是"重复"的("不甚理解"),或者在可更改维度中成员名是可更改的。
引用成员的"可选方法"是引用成员键。成员键由维度用来专门标识给定成员。在 MDX 中使用"和"号 (&) 字符将成员键与成员名区别开,如下面的示例所示:
[Time].[2nd half].&[Q4]
在这种情况下,使用"第四季度"成员的成员键 Q4。引用成员键确保在可更改维度中以及在具有非唯一成员名的维度中成员的正确标识。
"和"(&) 号字符可用来表示任何 MDX 表达式中的成员键引用。
计算成员:
还可将成员创建为 MDX 查询的一部分,以使返回的数据基于评估表达式,而不是要查询的多维数据集中所存储的数据。这些成员称为计算成员,它们提供大量的 MDX 的功能和灵活性。在 MDX 查询中用 WITH 关键字定义计算成员。例如,如果想要通过增加"包"度量值现有值的 10% 来对所有包裹进行预测估算,可以仅创建一个提供此信息的计算成员,并象使用多维数据集中的任何其它成员那样使用它,如以下示例所示。
WITH MEMBER [Measures].[PackagesForecast] AS
'[Measures].[Packages] * 1.1'
成员函数:
MDX 提供许多函数来从其它 MDX 实体(如维度和级别)检索成员,因此对成员的显式引用并非总是必要。
Time.[1st half]等价于
Time.FirstChild
元组:
元组用于定义来自多维数据集的数据切片;它由来自一个或多个维度的单个成员的有序集合组成。元组用于标识来自多维数据集的特定多维数据块;由来自多维数据集中各个维度的一个成员组成的元组完全描述单元值。换言之,元组是一种成员向量;请把元组看作基础数据库中的一个或多个记录,其这些列内的值归入这些分类。一系列关系图给出了元组的各种类型。
“帮助中有两个图,画得很好,看看很直观!”
在 MDX 中,元组根据其复杂性依照语法进行构造。如果它仅由来自单个维度的一个成员组成(通常称作简单元组),则以下语法是可接受的。
Time.[2nd half]
如果它由来自不止一个维度的成员组成,则元组所表示的成员必须括在圆括号内,如以下示例所示。
(Time.[2nd half], Route.nonground.air)
由单个成员组成的元组也可括在圆括号内,但这不是必需的。元组常常编组成集合,以便在 MDX 查询中使用。
元组函数:
有一些返回元组的 MDX 函数,它们可在任何接受元组的地方使用。
元组和“维数”!:
元组可包括多个维度中的成员,也可包括来自同一个维度的多个成员。术语维数用来表示元组中成员所描述的维度。顺序在元组的维数中起一定作用,并可影响集合内元组的使用。
集合:
集合是零个、一个或多个元组的有序集合。集合最常用于在 MDX 查询中定义轴维度和切片器维度,并且同样可能只具有单个元组或可能在某些情况下为空。下面的示例显示具有两个元组的集合:
{ (Time.[1st half], Route.nonground.air), (Time.[2nd half], Route.nonground.sea) }
一个集合可包含同一个元组不止一次的出现。下面的集合是可接受的:
{ Time.[2nd half], Time.[2nd half] }
集合指以元组表示的一组成员组合,或指集合中的元组所代表的单元中的值,视集合使用的上下文而定。
在 MDX 语法中,元组用花括号括起来以构造集合。
重要!!! 由单个元组组成的集合不是元组;MDX 将其解释为集合。某些 MDX 函数接受元组作为参数,而如果传递单个元组集合,则会产生错误。元组和单个元组集合不可互换。
聚合函数:
显式键入元组并将它们括在花括号内并不是检索集合的唯一方法。MDX 支持许多种返回集合的函数。
冒号运算符使使您得以使用成员的自然顺序创建集合。例如下面的集合:
{[1st quarter]:[4th quarter]}
检索与下面的集合相同的成员集合:
{[1st quarter], [2nd quarter], [3rd quarter], [4th quarter]}
冒号运算符是一种包含函数;冒号运算符两边的成员都将包含在结果集内。
其它返回集合的 MDX 函数可单独使用,也可作为以逗号分隔的成员列表的一部分使用。例如,下面所有的 MDX 表达式都是有效的:
{Time.Children}
{Time.Children, Route.nonground.air}
{Time.Children, Route.nonground.air, Source.Children}
集合和维数:
与元组一样,集合也有维数。由于集合由元组组成,因此集合的维数用其中各个元组的维数表达。正因为如此,所以集合中的元组必须具有相同的维数。换言之,下面的示例不能作为集合使用:
{ (Time.[2nd half], Route.nonground.air), (Route.nonground.air, Time.[2nd half]) }
集合内元组的顺序非常重要;例如,它影响轴维度内的嵌套顺序。第一个元组表示第一个或最外部维度,第二个元组表示次外部维度,以此类推。
命名集:
命名集是为其创建了别名的集合。命名集最常用在复杂的 MDX 查询中,以使这些查询更易阅读和便于维护。