[SQL Server2008]MDX查询语句

时间:2022-10-31 00:26:03

Essbase中使用MDX只能用于查询,尚不能来操作Cube(MS SSAS中可以使用MDX来操作Cube的),所以这里只学习MDX的Select语句。

 

在学习的过程中,我觉得最有难度的地方有两个。

一是,对OLAP多维的理解。如同学习SQL一样,SQL作用的对象是表,表的结构都是二维的,标识行列即可;但是MDX作用的对象是多维数据库,那么就得理解多维数据库的维度,层级,成员,以及如何在多维数据库中定位不同层级的成员。

二是,理解MDX查询语句的结构及术语的含义。学习SQL时,我们常提到表,字段,那么MDX中呢,想必这些术语必须理解,例如:Cube,Slice,Axis,Set,Tuple,Members

我的学习经历是这样的,首先了解MDX语句的特点及功用。

 

MDX全称是Mutil-Dimensional Expressions,即多为表达式。MDX是一种和SQL类似的语言,它也可以用于查询、计算和定义一些元数据。只不过SQL是基于OLTP的,而MDX是基于OLAP的,也就是说,MDX是对多维数据进行查询的。和其它的OLAP语言不同,MDX并不完全是一种报告形式语言。但用MDX查询出来的结果仍然可以在客户端程序中以表格形式进行展现。MDX和SQL一样,也有很多不同功能的API来支持MDX,最常用到的就是XML API。”

上面的一段话是从网上摘录来的,给MDX做了一个定义。

接下来学习MDX查询语句的结构及组成。

[<with_section>]

SELECT [<axis_specification>

       [, <axis_specification>...]]

[FROM [<cube_specification>]]

[WHERE [<slicer_specification>]]

这个结构就是MDX查询语句的通用结构,从中要理解哪些是关键字以及关键字的顺序,WITH section、Axis、Cube、Slicer的位置。这些都是MDX的语法规定,所以要牢记各自的位置。

 

然后学习的是以上MDX语句结构中各个位置的含义。

<with_section>的位置用于设定自定义的计算。有两种运用,WITH SET…,WITH MEMBER…,在复杂的MDX查询语句中经常被用到。

<axis_specification>的位置用于设定轴。这个轴是反映在MDX语句的输出报表上的。常用的就是列、行、页,如下图所示:

<cube_specification>位置用于指定查询用的Cube,只能指定一个。

<slicer_specification>位置用于指定限制条件,可以是多个限制条件,反映在Cube中称为切片。

到了这一步要学习就是MDX查询语句中每个轴上的内容了。如:Set、Tuple,Member等

Set称为“集合”,类似数学中集合的定义,要求集合内的成员结构必须相同;

Tuple称为“元组”,类似Member,但是特殊的地方是一个Tuple是由一个或多个成员组成,而这些成员来源于不同的维度,每个维度只能出现一次;

Member称为“成员”,就是Cube结构上的最小单位。

注意:Tuple的概念比Set小,一个Set中可以包含多个Tuple。

Tuple使用( )来标记;Set使用{ }来标记;

如果一个Set中有多个Tuple,那么这多个Tuple的组成维度必须相同,且顺序相同。

例如下面的例子就是错误的。

错误01:维度不同

{ ( [Time].[2005], [Measures].[Dollar Sales] ),

   ( [Time].[Feb, 2005],[Product].[Toys] )

}

 

错误02:维度相同,但是顺序变了。

{ ( [Time].[2005], [Measures].[Dollar Sales] ),

( [Measures].[Unit Sales], [Time].[Feb, 2005] )

}

 

错误03:Tuple中出现了同一维度的两个成员

( [Measures].[Unit Sales], [Measures].[Dollar Sales] )

 

学习到这里,我就可以写一些简单的MDX查询语句了。

例如:

SELECT

{[100-10], [100-20]} ON COLUMNS,

{[Qtr1], [Qtr2], [Qtr3], [Qtr4]} ON ROWS

FROM Sample.Basic

 

 

仅仅是简单的MDX查询语句是不够,要写出复杂的查询语句,必须学习MDX的一些函数。

我个人觉得学习这些函数,首先要了解这个函数的返回值是什么,可能是数值,布尔值,集合,元组,成员等;然后再去学习函数的输入参数是什么。完成这两点之后,学习使用MDX函数就会变得很简单。

经常用到的CrossJoin ,Filter, Order等。

学习其他函数请参见Oracle Hyperion Essbase Technical Reference。

最好的学习方法就是把所有的函数都学习一遍,这样以后用到MDX解决问题的时候就可以信手拈来。

 

学习了函数之后,还有一块重要的东西要学习,它是WITH Section.在WITH Section部分可以定义各种复杂的计算,功能十分强大。下面的一个例子就是使用WITH来实现合计。

 

WITH

SET [Top3BevsPerRegion] AS

'Generate ({[Market].children}, Crossjoin ({[Market].Currentmember}, TopCount ([Product].Children, 3, ([Measures].[Sales],[Year]))))'

MEMBER [Product].[Total] AS

'SUM(TopCount ([Product].Children, 3, ([Measures].[Sales],[Year])),[Measures].[Sales])'

SET [TT] AS

'Crossjoin ({[Market].Children},{[Product].[Total]})'

SELECT

{[Year].Children} ON COLUMNS,

Hierarchize({[Top3BevsPerRegion],[TT]}) ON ROWS

FROM Sample.Basic

WHERE ([Scenario].[Actual], [Measures].[Sales])

 

最后呢,当然要学习一下MDX语句执行的顺序是怎样的呢?如下

WITH ...

SELECT [NON EMPTY] ... [HAVING ...] on axis(0),

... on axis(1), ...

FROM ...

WHERE ...

 

1.解析FROM语句,选定查询的Cube;

2.解析WHERE语句,对Cube做切块;

3.解析WITH语句中的命名SETS,执行预定义计算;

4.解析每一个轴(Rows,Columns,.....)上的的Tuples,计算轴上的字段;

5.解析NONEMPTY,在轴的交叉点上计算出结果。

图示: