`
刘小小尘
  • 浏览: 62475 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MDX基础 多维度查询

 
阅读更多

一、什么是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 查询 EXISTING 关键字 用查询轴和切片器轴限定查询 指定查询轴的内容 指定切片器轴的内容 在简单示例中使用查询轴和切片器轴 在查询中建立多维数据集上下文 在 MDX 中生成子多维数据集 在...

    MDX解决方案(第2版)中文版

    第1章 MDX入门 第2章 计算成员和命名集简介 第3章 MDX中的通用计算和选择 第4章 MDX查询上下文与执行 第5章 命名集与集的别名 第6章 MDX中的排序和分类 第7章 MDX高级应用 第8章 使用Microsoft Analysis ...

    MDX解决方案(第2版)-中文版.part2.rar

    第1章 MDX入门 第2章 计算成员和命名集简介 第3章 MDX中的通用计算和选择 第4章 MDX查询上下文与执行 第5章 命名集与集的别名 第6章 MDX中的排序和分类 第7章 MDX高级应用 第8章 使用Microsoft Analysis ...

    MDX解决方案(第2版)-中文版.part1

    第1章 MDX入门 第2章 计算成员和命名集简介 第3章 MDX中的通用计算和选择 第4章 MDX查询上下文与执行 第5章 命名集与集的别名 第6章 MDX中的排序和分类 第7章 MDX高级应用 第8章 使用Microsoft Analysis ...

    MDX解决方案(第2版)英文版

    第7章 MDX高级应用 第8章 使用Microsoft Analysis Services的属性数据模型 第9章 Hyperion Essbase中属性维度和成员属性的用法 第10章 通过外部函数扩展MDX 第11章 通过MDX改变多维数据集和维度环境 ...

    MDX解决方案(第2版)中文版 卷2

    第1章 MDX入门 第2章 计算成员和命名集简介 第3章 MDX中的通用计算和选择 第4章 MDX查询上下文与执行 第5章 命名集与集的别名 第6章 MDX中的排序和分类 第7章 MDX高级应用 第8章 使用Microsoft Analysis ...

    SQL Server 2008商业智能完美解决方案 3/3

    用MDX和DMX查询设计器构建基于OLAP多维数据集和数据挖掘模 型的报表; 用NET代码建立并实现自定义对象; 在Microsoft Office Excel和Office SharePoint Server中查看报表。 微软公司US-SQL Analysis Services 首席...

    SQL Server 2008商业智能完美解决方案 1/3

    用MDX和DMX查询设计器构建基于OLAP多维数据集和数据挖掘模 型的报表; 用NET代码建立并实现自定义对象; 在Microsoft Office Excel和Office SharePoint Server中查看报表。 微软公司US-SQL Analysis Services 首席...

    SQL Server 2008商业智能完美解决方案 2/3

    用MDX和DMX查询设计器构建基于OLAP多维数据集和数据挖掘模 型的报表; 用NET代码建立并实现自定义对象; 在Microsoft Office Excel和Office SharePoint Server中查看报表。 微软公司US-SQL Analysis Services 首席...

    SQL Server 2008 商业智能完美解决方案(3)

    用MDX和DMX查询设计器构建基于OLAP多维数据集和数据挖掘模 型的报表; 用NET代码建立并实现自定义对象; 在Microsoft Office Excel和Office SharePoint Server中查看报表。 微软公司US-SQL Analysis Services ...

    数据仓库与数据挖掘技术

    第6章介绍OLAP的MDX表示与实现,涉及OLAP的基本分析动作的MDX语言表示与实现及OLAP的前端展现方式,提供了丰富的MDX语言程序实例;第7章介绍数据挖掘基础,主要包括数据发掘的概念、数据发掘技术、工具、方法及步骤...

Global site tag (gtag.js) - Google Analytics