在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,在轴的交叉点上计算出结果。
图示: