MDX查询基础(一)

本文完全转载自:http://blog.sina.com.cn/s/blog_622a0069010120pc.htmlhttp://blog.sina.com.cn/s/blog_622a0069010120pc.html

自己初学收藏!

一、什么是MDX

MDX是一种和SQL类似的语言,它也可以用于查询、计算和定义一些元数据。只不过SQL是基于OLTP的,而MDX是基于OLAP的,也就是说,MDX是对多维数据进行查询的。和其它的OLAP语言不同,MDX并不完全是一种报告形式语言。但用MDX查询出来的结果仍然可以在客户端程序中以表格形式进行展现。MDX和SQL一样,也有很多不同功能的API来支持MDX。其中包括对象链接和为在线分析处理的内嵌数据功能(也就是OLE DB for OLAP)、ADO MD、ADOMD.Net、XMLA(XML for Analysis)等。OLE DB for OLAP的规范描述了MDX查询和将被查询信息发送给客户端的数据结构之间的完整关系。

二、第一次使用MDX
在本节中,我们将按着步骤来执行一系列简单的MDX查询。通过对本节的学习,读者可以很轻松地将MDX的概念转化为实际的例子。

我们可以想象有一个非常简单的立方体,这个立方体有三个维度,分别代表时间、地理位置和销售业绩。我们给这个立方体起名为Sales。现在让我们看看下面的一个表格。这个表格中的数据是在2007年头两个季度在北京的销售量和销售额。这个表格有两个维度,就象一个电子表格一样,但是在第一列表示了两个维度,因此,这个表格实际上是三个维度。表格如表1-1所示:

image

在上面的查询中,涉及到了SELECT、FROM和WHERE关键字,这些关键字代表了不同的部分。MDX查询的结果本身是一个表格,实际上是另外一个立方体。我们将要查询的维度作为结果集的列。这个查询应用了两个被命名的行和列。在MDX技术中,一个轴是一个边或一个查询结果集的维度。使用轴要比直接使用立方体体的维度更简单,而且每个轴还可以是多个立方体维度的组合。我们可以根据上面的语句将这个例子泛化。现在让我们将这个查询分成以下几部分:

1. SELECT子句是MDX语句的开始,用于指定我们想要获得什么信息。

2. ON关键字后面跟着用于指定维度的轴的名称。在这个例子中将销售业绩放到columns轴上,将时间信息放到row轴上。
3. MDX使用上卷括号{和}来装入从一个特定的维度或维度集合中装入数据。在我们的例子中在每个查询中只有一个维度。我们可以使用逗号来分割不同的元素。元素名可以放到[]中,可以使用多个“.”进行分割。

4. 在一个MDX查询中,我们指定了维度如何从我们的数据库中映射到我们的结果集轴上。在这个查询中是销售业绩映射在了columns轴上,而时间映射在了rows轴上。每一个查询可以用不同数量的结果集轴。前三个轴的名为"columns","rows"和"pages",这些轴从形式上和报表的格式一致。

5. 一个MDX查询中的FROM子句用于指定被查询的数据的名称。这和SQL语句中的FROM子句类似。

6. WHERE子句提供了一种用于指定在当前立方体中未出现维度的方法。如果我们不指定其它的维度,那么MDX将使用默认的维度。因此,WHERE子句对于MDX查询是可选的。

一但数据库已经确定了查询结果集的单元格,就会将从立方体中查询出来的数据这些单元格。MDX和SQL都拥有SELECT、FROM和WHERE关键字。但要注意的是,这三个关键字和SQL中的并不一样,在学习MDX时最好忘记SQL中的这几个关键字。这是因为它们的含义和语法不相同,如果试着将SQL中的这些关键字的经验应用到MDX中,是非常不明智的。下面让我们来看另外一个例子。为了产生表1-2的结果集,我们可以写如下的MDX语句:

image

我们可以从上面的代码看到,时间、位置和销售业绩仅仅被columns上的时间列表、rows上的客户和WHERE部分的销售业绩选择。

三、轴的应用
我们有很想通过“on columns/rows/”等语法将很多成员放到columns或rows或是查询结果集的其他轴里。对于轴的表示可以通过指定轴的名称,如下面的MDX表达式:

SELECT
{[Customer].[MA], [Customer].[CT] }
on rows,
{ [Time].[Q1, 2005], [Time].[Q2, 2005], [Time].[Q3, 2005] }
on columns
FROM Sales
WHERE ( [Measures].[Dollar Sales] )

我们还可以使用数字索引来引用查询中的轴,代码如下:

{ [Time].[Q1, 2005], [Time].[Q2, 2005], [Time].[Q3, 2005] }

on axis(0),

{[Customer].[MA], [Customer].[CT] }

on axis(1)

axis(n)的表达形式确定这些成员将被放到序号为n的辆上。对于没有名称的轴,必须使用索引来引用轴。我们还可以在查询中混合使用索引和名称,代码如下:

SELECT
{[Customer].[MA], [Customer].[CT] }
on rows,
{ [Time].[Q1, 2005], [Time].[Q2, 2005], [Time].[Q3, 2005] }
on axis(0)
FROM Sales
WHERE ( [Measures].[Dollar Sales] )

然而,一个使用轴的查询还必须使用索引为0的轴,并且一个使用轴2的查询必须使用轴1和0。否则将会出现错误。如以下的代码将抛出一个错误:

SELECT
{[Customer].[MA], [Customer].[CT] }
on axis(2),
{ [Time].[Q1, 2005], [Time].[Q2, 2005], [Time].[Q3, 2005] }
on axis(0)
FROM Sales
WHERE ( [Measures].[Dollar Sales] )

四、MDX语法基础
在这一节让我们学习一下MDX频繁使用的一些操作符和函数。我们将介绍它们,并描述它们常用的使用方法。下面是本节将介绍的内容。

1.逗号(,) and 冒号 (:)

2..Members

3..Children和 Descendants()

逗号(,) and 冒号 (:)

到现在为此我们已经看到逗号操作符被应用到了Mdx语句中;现在让我们学习更多的

关于逗号的知识。首先我们可以使用逗号来分割组件和它的属性。如下面的代码如示:

{ [Time].[January 2007], [Time].[February 2007],

[Time].[March 2007] }
上面语句的功能是列出2007年头三个月数据。
在每一个维度的第一层的成员通常按着一个顺序排列(通常是按着key或是名称进行排列)。根据这个顺序,我们可以将两个成员中间的数据作为一个集合列出。而集合的两端就是两个成员。这两个成员使用冒号(:)分割。这有些和在Excel中指定单元格之间的范围类似。如下面的查询的结果是列出2005年9月和2007所10月的月份以及在产生目录中从Tools到Audio的数据。代码如下:

SELECT
{ [Time].[Sep,2005] : [Time].[Oct,2007] } on columns,
{ [Product].[Tools] : [Product].[Home Audio] } on rows
FROM [Sales]
WHERE ([Customer].[Lubbock, TX], [Measures].[Unit Sales])

我们还可以将逗号和冒号混合使用,如下面的代码如下:

{ [Time].[2005], { [Time].[January-2006] : [Time].[March-2006] } }
上面的代码建立一个2005年的集合以及2006年1月至3月的集合。
.Members

获得一个维度、层次的成员集合是非常普遍的一种操作,也是进一步做其他操作的基础。.Members操作符可以操作一个维度、层次,并返回所有和这些元数据范围的所有成员的集合。如[Customer].Members返回所有的的Customer集合,而[Product].[Product Category].Members返回所有的成员的产品目录的成员。例子代码如下:

SELECT
{ [Scenario].Members } on columns,
{ [Store].Members } on rows
FROM Budgeting

当一个客户使用.Members(或是其他可以返回和响应的成员集合的元数据函数),分析服务和Essbase都不会包括任何被计算过的成员。在分析服务中还提供了AddCalculatedMembers()和.AddMembers函数来向集合中加入成员。

.Children

另一种使用频率非常高的选择方法就是获得成员的孩子(children)。我们可以使用下钻的操作,或者是简单地获得一个基于parent的成员的范围。MDX提供了一个.Children函数,这个函数将为我们实现这个功能。下面的MDX语句将在rows上选择[Product].[Tools]的成员和它的Children,代码如下:

SELECT
{ [Time].[Q3, 2005].Children }
on columns,
{ [Product].[Tools], [Product].[Tools].Children }
on rows
FROM Sales
WHERE ([Customer].[TX], [Measures].[Unit Sales])

我们可以通过这个函数获得任何一个有Children的成员的Children。如果我们获得一个叶子节点的孩子,就会得到一个空的集合。
使用Descendants()函数获得成员的子孙
为了获得成员的更深层次的孩子。或是为了进行更深的搜寻,我们可以使用Descendants()函数。由于这个函数的选择过我,因此,我们只讨论一下它的基本的用法。
Descendants ()方法的语法如下:

Descendants (member [, [ level ] [, flag]] )

Descendants()方法返回了和层次或当前的成员的子孙。下面是这个方法的一些选项:

SELF

BEFORE

AFTER

SELF_AND_BEFORE

SELF_AND_AFTER

SELF_BEFORE_AFTER

LEAVES

SELF仅仅引用了层的成员,这是最学用的选项。如下面的代码选择了2007年的月份。代码如下:

SELECT

{ [Product].[Tools], [Product].[Toys] } ON COLUMNS,

Descendants (

[Time].[2007],

[Time].[Month],

SELF

)

ON ROWS

FROM Sales

WHERE [Measures].[Dollar Sales]
由于SELF使用非常频繁,因此,这个选项是默认的。如果我们在代码中忽略了这个标志。如Descendants ([Time].[2007], [Time].[Month])同样返回2007年的月份列表。

另外一个选项SELF_AND_BEFORE表示返回SELF和“before”层之间的所有成员。如下面的代码挑出了在2007年的四个季度和每个月份。代码如下:

{ [Product].[Tools], [Product].[Toys] } ON COLUMNS,
Descendants (
[Time].[2007],
[Time].[Month],
SELF_AND_BEFORE
)
ON ROWS
FROM Sales
WHERE [Measures].[Dollar Sales]
MDX 中的重要概念 使用成员、元组和集 (MDX) MDX 语法元素 标识符 表达式 使用多维数据集表达式和子多维数据集表达式 使用维度表达式 使用成员表达式 使用元组表达式 使用集表达式 使用标量表达式 使用空值 运算符(MDX 语法) 算术运算符 位运算符 比较运算符 串联运算符 集运算符 一元运算符 赋值运算符 函数(MDX 语法) 使用字符串函数 使用数学函数 使用逻辑函数 使用成员函数 使用元组函数 使用集函数 使用维度函数、层次结构函数和级别函数 使用存储过程 (MDX) 注释(MDX 语法) 保留关键字(MDX 语法) MDX 查询基础知识 基本 MDX 查询 EXISTING 关键字 用查询轴和切片器轴限定查询 指定查询轴的内容 指定切片器轴的内容 在简单示例中使用查询轴和切片器轴 在查询中建立多维数据集上下文 在 MDX 中生成子多维数据集 在 MDX 中生成命名集 创建查询作用域的命名集 创建会话作用域的命名集 在 MDX 中生成计算成员 在 MDX 中生成单元计算 创建和使用属性值 操作数据 修改数据 使用变量和参数 MDX 脚本编写基础知识 基本 MDX 脚本 管理作用域和上下文 错误处理 支持的 MDX MDX 语言参考 MDX 语法约定 MDX 语句参考 MDX 脚本编写语句 MDX 数据定义语句 MDX 数据操作语句 MDX 运算符参考 --(注释) -(排除) -(负) -(减) *(叉积) *(乘) /(除) ^(幂) /*...*/(注释) //(注释) :(范围) +(加) +(正) +(字符串串联) +(联合) <(小于) <=(小于或等于) (不等于) =(等于) >(大于) >=(大于或等于) AND IS NOT OR XOR MDX 函数参考 AddCalculatedMembers Aggregate AllMembers Ancestor Ancestors Ascendants Avg Axis BottomCount BottomPercent BottomSum CalculationCurrentPass CalculationPassValue Children ClosingPeriod CoalesceEmpty Correlation Count(维度) Count(层次结构级别) Count(集) Count(元组) Cousin Covariance CovarianceN Crossjoin Current CurrentMember CurrentOrdinal CustomData DataMember DefaultMember Descendants Dimension Dimensions Distinct DistinctCount DrilldownLevel DrilldownLevelBottom DrilldownLevelTop DrilldownMember DrilldownMemberBottom DrilldownMemberTop DrillupLevel DrillupMember Error Except Exists Extract Filter FirstChild FirstSibling Generate Head Hierarchize Hierarchy IIf Intersect IsAncestor IsEmpty IsGeneration IsLeaf IsSibling Item(成员) Item(元组) KPIGoal KPIStatus KPITrend KPIWeight KPICurrentTimeMember KPIValue Lag LastChild LastPeriods LastSibling Lead Leaves Level Levels LinkMember LinRegIntercept LinRegPoint LinRegR2 LinRegSlope LinRegVariance LookupCube Max MeasureGroupMeasures Median Members(集) Members(字符串) MemberToStr MemberValue Min Mtd Name NameToSet NextMember NonEmpty NonEmptyCrossjoin OpeningPeriod Order Ordinal ParallelPeriod Parent PeriodsToDate Predict PrevMember Properties Qtd Rank RollupChildren Root SetToArray SetToStr Sib
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值