MDX主要是用于OLAP查询语言,全称:Multi-Dimensional Expression。语法类似于OLTP的结构化查询语言SQL,但又有很大的区别。看了一下Sql-server的联机帮助,结合公司的现有OLAP实现,简单的学习了一下。
1:概念:层次结构
对于其它几个概念:维度,级别,成员,属性都比较好理解,只是层次结构的概念,开始有些模糊。
实际上,层次结构处于维度和级别之间,体现的是单一维度可以演化出的多个级别方案。比如产品维度,它可以有 大分类>>明细分类>>产品名称 一种级别方案,还可以有 分类>>产品名称 另一种级别方案。这两种方案就构成了两种层次结构。
在应用中,一般只采用一种级别方案,比如我们公司的OLAP实现产品提供的模型定义,就不体现层次结构的概念,也就是说,系统只提供
一个层次结构。想一想,对于OLAP中的某一个主题分析中的某个维度,一般也只会有一种固有级别方案。
2:语法:
最基本的语法:select 轴1,轴2,…… from 立方体模型名 where 切片
可以看到,非常类似于SQL的语法:Select 列1,列2…… from 表1,表2…… where 条件子句。
首先,需要理解轴的概念:
轴:相当于SQL里的列,想象轴,需要有点立体概念,或者,我们把问题简化,对于平面表的展示,只会存在两个轴,也就是列轴和行轴。现有的大多数OLAP展示,也只体现这两个轴,我们公司的产品也不例外。说具体一点,轴对应于一个集合。
集合:由元组形成,
元组:可包括多个维度中的成员,也可包括来自同一个维度的多个成员。
成员:维度中一次或多次数据出现的项。
再看看立方体模型:这个很好理解,也就是主题分析时形成的模型方案了,MDX只支持单一模型。
最后看一下 切片:这和SQL中的筛选一样。不过,因为OLAP的数据是立体的,多维的,要变成平面,就需要切啊,切啊,把一些不需要展示的维度设定固定值(也就是切一下)。注意:当不指定任何切片时,一般的实现是将未出现的维度的默认成员值做为切片值。
3:计算成员列
一般用 With Member 计算成员 as '' 来生成计算成员列,然后在Select中引用。
as中的表达式,可以使用MDX函数。
4:MDX函数
函数很多,除了常见的数值,逻辑,字符串处理,特有的是:维度/层次/级别函数,成员函数,聚合函数。
某些函数是具有很强的业务性的:比如 BottomSum:取出指定和值的底部若干行。这类函数,需要在实际应用在才能体会。
5:SOLVE_ORDER
这个用来指定计算成员中的计算传递顺序,因为计算成员间有一个计算传递和顺序的问题。
6:成员属性
属性作为一种扩充,也就是将某些列作为维度的扩充值,进行补充说明。一般在定制立方体模型时确定。在我们的实现中,还将属性作为了一种配置方案,比如 Caption属性用来作为维度的显示值,Name属性作为标识值。这个具体要看前端展示的解释方式
7:单元属性
主要完成单元格的样式设置。样式包括:字体,字串格式,前景,背景……
单元属性更多时候只是展示的视图需要,所以,在实现时也可以在前端处理,比如网格本身的属性设置。比如,我们现有的实现中,还提供了一种条件的设置,可以通过条件判定进行区分的样式显示,满足特定的展示需求。