`
刘小小尘
  • 浏览: 65983 次
  • 性别: 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的学习笔记

    1. **轴和成员**:MDX中的查询结构由多个轴组成,最常见的有行轴、列轴和页轴。轴上的每个位置被称为一个成员,成员可以是维度的层级、属性或者单个值。例如,行轴可以包含时间维度的年、季度和月份成员。 2. **...

    mdx资料.rarmdx资料.rar

    4. **数据钻取和切片**:展示如何使用MDX进行数据的上下钻取和切片操作,以实现多维度的数据探索。 5. **透视表和图表**:讲解如何用MDX创建动态的透视表和图表,用于数据可视化。 6. **联机分析处理(OLAP)操作*...

    MDX例子

    OLAP系统设计用于快速响应多维度查询,支持多角度、多层次的数据分析。 综上所述,MDX是BI和OLAP领域的重要工具,它提供了丰富的语言特性来处理和分析多维数据,对于理解并优化商业决策至关重要。通过学习和实践MDX...

    MDX 入门教材

    通过学习这本教材,读者将掌握如何创建基本的MDX查询,理解如何利用维度和度量,以及如何使用各种函数和操作提升查询的复杂性和灵活性。这将有助于在实际业务环境中更好地利用多维数据进行决策支持和数据分析。

    mdx编码教程-英文版

    MDX的基础知识包括以下几个方面: 1. **多维数据模型**:在MDX中,数据存储在多维结构中,称为“立方体”。立方体由维度和度量组成,维度代表数据的不同方面,如时间、地区或产品,而度量通常是数值型的数据,如...

    MDX_函数的使用介绍

    一、MDX基础 MDX的基本结构包括维度、层次、成员和切片器。维度是数据的分类,如时间、地区等;层次是维度内的分组,如时间维度可以有年、季度、月层次;成员则是层次中的具体单元,如2022年;切片器则用于定位特定...

    MDX详解文档

    #### 四、MDX基础知识 MDX语言是为OLAP系统设计的一种查询语言,它能够方便地进行多维数据分析,支持诸如透视表、汇总、筛选等功能。MDX的一些基本概念包括: - **维度(Dimension)**:维度是数据的分类方式,例如...

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

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

    《MDX解决方案(第2版)》示例代码和数据

    示例代码通常包括各种查询、计算和切片操作,涉及维度导航、成员选择、度量计算、集合操作等多个方面。数据部分则提供了运行这些示例所需的多维数据模型,可能包含模拟业务场景的销售、财务等数据,以便读者在实际...

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

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

    MDX解决方案(第二版) wiely出版社出版

    1. **MDX基础**:MDX是一种强大的查询语言,专为处理多维数据模型设计。它提供了对维度、层次、成员和单元的访问,使用户能够从不同的角度探索和分析数据。 2. **多维数据模型**:在多维数据模型中,数据组织成一个...

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

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

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

    在这一章节中,作者会详细介绍MDX查询的执行过程,包括查询解析、优化、上下文处理等多个方面。通过了解MDX查询的内部机制,可以帮助开发者更好地设计查询语句,减少不必要的性能开销。同时,本章也会涉及到如何处理...

    SQL_Server_SSAS_MDX_翻译资料

    在后续章节中,读者将更深入地学习维度、层级结构和层的概念,了解如何使用MDX构建复杂的查询和多维表达式,以及如何通过MDX进行数据分析和报告。理解并熟练掌握MDX是成为有效的SQL Server SSAS分析专家的关键步骤。

    Fast Track to MDX.pdf(附演示数据库)

    1. **立方体(Cube)**:多维数据集的基础,包含了所有维度和度量。 2. **维度(Dimension)**:代表数据的一个方面,如时间维度、产品维度等。 3. **层次(Hierarchy)**:在每个维度内,成员按照逻辑顺序排列形成...

    MDX学习笔记

    这类似于SQL中的`ORDER BY`语句,但MDX允许在多维度上进行复杂的排序。 5. 元组作为一列显示: 当需要在一个列中显示多维数据时,可以将Rows轴的所有元组作为一个层次结构显示。例如,`{ [Measures].[Internet ...

Global site tag (gtag.js) - Google Analytics