#####概述
1. MDX(Multidimensional Expression)支持多维对象和数据的定义和操作。不是SQL的拓展。
2. MDX查询都要求有select , from ,where子句。
3. MDX提供管理数据结构的DDL语法,包含创建和删除cube,维度,度量值以及他们的坐标对象的命令。
####基本概念
1. MDX从多维数据集返回多维数据子集。
单元:坐标轴相交确定的对象。唯一标识多维数据集中的最小单元
每个单元都有多个信息与之相关联,包括数据本身,格式化字符串(单元数据的显式格式),以及单元的序号。
元组:来自一个或多个维度的单个成员的有序集合组成。唯一标识多维数据集中的一部分,用来定义来自多维数据集数据的切片或切块。
元组是一个成员向量,如果来自不止一个维度的成员组成,则元组所表示的成员必须包括在圆括号内。
集合:零个,一个或多个元组的有序集合。
集合需要使用花括号包起来。
****集合中的元组必须具有相同的维度顺序。****
2. 轴维度和切片器维度(切片条件)
不同维度的成员组成的元组的集合用于度多维数据集数据进行过滤。select语句用来选择要返回的维度和成员——轴维度(返回多个成员的数据)
where语句用来将返回的数据限定为特定维度和成员条件——切片器维度(返回单个成员的数据)
***如果未显式的给切片器指派维度,则使用默认成员进行筛选。
如果存在“All”级别,则默认成员为“All”,否则为最高级别的任意成员。***
SELECT <轴信息> on columns
<轴信息> on rows
from <多维数据集>
where <切片条件>
3. 计算成员
基于MDX中的估值表达书的成员
4. 用户定义函数
5. PivotTable服务
MDX数据定义和操作服务通过PivotTable服务提供
6. 成员函数
MDX提供了很多函数来从其他的维度或级别(MDX实体)检索成员。
如FirstChild允许从给定维度或级别检索第一个子代成员
Members函数返回维度,级别或层次结构中的成员的集合。
7. 聚合函数
冒号运算符使用陈冠的自然顺序创建集合 如{[第一季度]:[第四季度]}
######MDX相对于SQL的主要特点(操作对象为多维数据集)
1. MDX可以查询任意多维度数据结构中的数据
2. select子句可以定义几个轴维度,where子句可以用来把多维数据限制在特定的维度或成员。
3. MDX查询的创建者通常将多维数据集的结构形象化并加以定义,并且编写对单个多维数据集的查询对该结构进行填充
OLAP架构包括多维数据集,度量值,维度,级别,成员,层次结构,以及成员属性信息。在MDX查询中都有与之对应的表示。
维度和度量:他们在同一个多维数据集中是唯一的,因此可以直接使用名称表示
层次结构:他属于的维作为前缀,跟着一个点号,然后加上他的名称
级别:方括号中的维度名称,加上在方括号中的层次结构名称,最后是级别的名称,并用点号分隔来构成。
成员:必须沿着维度的层次体系逐一添加将要访问的成员所属的级别之上的所有级别的成员名称
成员属性:为了唯一标识一个成员属性,需要将其名称加在它所属的级别之后,并用点号分隔
####使用方括号
在MDX中有两种方法来引用架构中的各个项名称
1. 使用方括号[]
2. 不使用方括号,直接引用各项的名称。
如果引用的架构中的项的名称包含空格,必须使用方括号
如果成员的名称包含方括号,则必须使用转义符,转义符也是方括号[]
如果某个标识符由多个部分的名称组成,则MDX使用点号来分隔
#########基本的MDX查询
MDX查询必须包含如下项:
1. 轴的数目,最多可指定128个轴,但是只有前5个轴有别名,分别是Columns(列),Rows(行),Pages(页),Sections(节),Chapters(章)。(ON AXIS(index) index轴号, 0开始),轴可以使用其在MDX查询中的顺序位置或者别名来引用
2. 要包括在MDX查询的各个轴上的各个维度的成员(轴维度成员)
3. 设置MDX查询上下文的多维数据集的名称
4. 来自切片器维度的成员,在该维度上对来自轴维度的成员进行数据切片(限定范围)
5. 通常用花括号{}括住元组或成员来辨别集合
可以使用逗号和冒号来分隔单元集合中的成员
也可是使用.Member操作符来返回某个维,级别或层次结构的所有成员
注意:“:”只有一个方向。如2月:10月,返回2到10月;10月:2月,返回10月到12月
注意:维度如果有多个层次,在构造集合时还要包含层次结构的定义
注意:在构造集合是逗号和冒号可以同时使用
########.Member和.Children
1. 如果一个维度级别中的成员没有明确的逻辑顺序,也不希望逐一引用其中的成员,可以使用.Member 返回全体成员
注意:不会返回计算成员
2. .Chidren操作符返回某个级别的维度成员的下一个级别的所有子成员
########Crossjoin()函数连接多个维的成员
大多数情况下,单元将包含多个维的成员,MDX使用CrossJoin()函数来实现。
Crossjoin({Set1},{Set2})
该函数返回两个不同集合{Set1},{Set2}成员的相交的结果。相交或者是笛卡尔乘积,指这些成员所有可能的组合。
注意:
1. CrossJoin函数中集合的顺序无关紧要,不会影响结果,只会影响列的一级标题和二级标题的顺序
2. CrossJoin函数一次只能处理两个集合。如果要计算多余两个集合的交叉乘积,需要嵌套使用该函数。
#########使用Order()函数对数据排序
Order()函数的功能是在集合中按照魔衣特定的顺序排序
参数是要排序的集合,排序依据,一个排列方式。
语法:
Order({SET},Criterion for ordering,Flag(DESC,ASC,BASC,BDESC))
########成员和成员键
引用成员的方法是引用成员键(&)
???成员键是由维度用来专门标识给定成员的
##########建立多维数据集上下文
from子句未限定用户一次使用多个cube,可以使用LookupCube函数从cube的上下文以外的cube检索数据。
与SQL不通的是,From子句不允许多个cube在后面连接。
##########创建和使用属性值
1. DIMENSION PROPERTIES关键字
property语法的分解会因所查询的属性二有所不同,维度和级别的内在成员属性前必须加上维度和级别的名称。
成员的内在成员属性不能由维度名或级别名限定。
自定义成员属性前面应该加上其所驻留的级别名称。
2. Properties函数
???成员属性还可以使用Properties函数进行检索。Properties函数为字符串函数,使用Val()函数可以将成员属性强制转化为字符串。
3. 内在维度和级别成员属性
所有维度和级别均支持下面的内在成员属性。
ID 成员的内部维护ID
Key 存储在MEMBERS架构行集的MEMBER_KEY列中成员的值
Name 成员的名称
DIMENSION.PROPERTIES [《Dimension》].《Level》.ID
维度成员属性前是应用属性的维度的名称:
DIMENSIUON PROPERTIES <DIMENSION>.ID
级别成员属性前可加上级别名。
DIMENSIUON PROPERTIES <DIMENSION>.<Level>.ID
4. 内在成员属性
内在成员属性不能应用在特定的维度或级别上,也就是内在成员属性不能为特定的维度或级别加以请求。而是用于多维表达式MDX查询中轴维度的所有成员。
在MDX查询中指定PROPERTIES DISCRIPTION 来返回对轴维度中各个成员的描述。
CALCULATION_PASS_DEPTH(计算公式的传递深度):仅用于计算单元。确定解析计算公式需要多少个传递
CALCULATION_PASS_NUMBER:计算公式传递号,确定解析公式将在哪个传递上开始赋值和结束计算。默认值为1,最大值为65535。
5. 自定义成员属性
自定义成员属性还可以添加到维度中的特定命名级别中,不能添加的维度的“All”级别或者维度本身。
引用语法:
PROPERTIES [<Dimension>].<Level>.<Custom Member Property>
6. 单元属性的使用
MDX单元属性所包含的是单元的内容和格式的信息。
MDX支持SELECT语句中的CELL PROPERTIES关键字来检索内在单元属性。
语法:
SELECT [轴信息]
FROM [多维数据集]
WHERE [切片条件][单元属性]
<单元属性>使用CELL PROPERTIES关键字以及一个或者多个内在单元属性。
语法: CELL PROPERTIES <property>
内在单元格属性:
BACK_COLOR:背景颜色
CELL_EVALUATION_LIST:适用于单元的额以分号分割的一列求职公式,按从低到高的求解次序排列。
CELL_OPDINAL:数据集中单元的序列号
FORE_COLOR:VALUE或者FORMATTED_VALUE属性的前景颜色
默认情况下,如果未使用CELL PROPERTIES关键字,则返回单元属性VALUE,FORMATTED_VALUE, CELL_ORDINAL(按顺序)
7. 使用Custom Member Option属性
???使用维度编辑器或多维度数据集编辑器的Custom Member Options属性,可通过Analysis Manager设置单元属性
#########格式化串
8. 使用FORMAT_STRING单元属性
FORMAT_STRING单元属性用于格式化VALUE单元属性,以创建FORMATTED_VALUE单元属性值。
格式化串根据单元值得数据类型的不同而有所不同。
9. 使用字符串值的格式化串
字符串的格式表达式可以使一部分,也可以是有分好(;)分隔开的两部分
一部分格式应用于所有字符串值
两部分时,第一部分应用于字符串数字,而第二部分应用于空值和零长度字符串(“”)
@ 字符串占位符,显式一个字符胡一个空格
& 字符串占位符,显式一个字符或者什么都不显示
< 强制小写。
> 强制大写
! 强制从左到右填充占位符
10. 使用数字值的格式化串
数字的用户定义格式表达式可以有一个到四个由分号分隔的部分。
一部分:格式表达式应用于所有值
二部分:第一部分应用于正值和零,第二部分应用于负值
三部分:第一部分应用于正值,第二部分应用于负值,第三部分应用于零
四部分:第一部分应用于正值,第二部分应用于负值,第三部分应用于零,第四部分应用于空值
11. 生成MDX中的命名集
命名集是一个与别名相关联的集合表达式,是维度成员集合或所创建的可以再度使用的集合表达式。
使用WITH创建命名集
WITH
SET <set_name> AS '<set>'
<set_name>参数包含命名集的别名
<set>参数包含命名集的别名所指的集合表达式
注意:
1. 命名集只在定义他的范围内有效
2. WITH段定义的命名集属于查询的局部,查询执行完之后就无效了
3. 可以使用CREATE SET 创建服务器或客户端的集合。服务器端创建的集合对访问或查询集合所在的多维数据集的客户端都是可用的,
客户端创建的集合只有在该客户端使用
InStr([start],string1,string2,[compare]):返回指定一字符串在另一个字符串中最先出现的位置
???CurrentMember:拒绝对度量值“XX”单元的访问,但允许对所有其他度量值的单元的访问。
Filter(<Set>,<Search Condition>):返回根据搜索条件对指定集合进行筛选所得到的集合。
12. 使用WITH创建计算成员
计算成员将作为维的新成员防止在坐标轴上,他将用计算结果来填充单元
WITH操作符可以在MDX中定义计算成员和命名集,放置在SELECT之前,用于声明一个计算成员或命名集。
WITH
MEMBER <member_name> AS '<calculation_formula>'
[SOLVE_ORDER=<unsigned integer>]可选
[<cell_property>=<value_expression>]可选
<member_name>值是计算成员的合法名称,
<calculation_formula>在经过计算后,将返回计算成员的值
使用SOLVE_ORDER关键字指定计算成员的求解次序
<cell_property>中提供单元属性的名称和<value_expression>中提供单元属性的值
注意:使用WITH产生的计算成员只能用在创建它们的查询中,MDX还支持在服务器端或客户端定义计算成员。
服务器端的计算成员对所有可以访问该成员所在的多维数据集的客户端均可见。该功能就是CREATE MEMBER语句
1.它要和多维数据集的名称和维的名称一起使用
2. 该语句不属于使用成员的查询部分,他是独立的语句
13. 生成MDX的计算成员
计算成员可以在层次结构的任意位置创建。
同一个MDX中的计算成员可以被其他的计算成员引用。
14. 在计算成员中使用函数
算术运算符:+,-,*,/
比较运算符:<,>,>=,<=,<> ??? ,=
按位运算符:AND,OR,NOT,XOR ???
集合运算符:<Set1>+<Set2> 对两个集合执行Union函数;
<Set1>*<Set2> 对两个集合执行CrossJoin函数;???
<Set1>-<Set2> 对两个集合执行Except函数;
<Member1>:<Member2>创建自然排序集合,并将两个成员作为终结点,这两个指定成员间的所有长远作为集合的成员包含在其中。
15. 数值函数
???聚合函数Aggregate()
Median函数计算集合内的中值。
sum()
16. 字符串函数
MemberToStr
17. 集合函数
集合函数用于在MDX中返回集合,为用户提供方便生成动态定义的集合和快速创建可再次使用的命名集合的功能。
Members函数:将级别或维度的多有成员(除计算成员)作为一个集合返回。
18. 元组函数
用于在MDX中返回元组
StrToTuple
19. 成员函数
计算成员中常常引用成员,成员函数允许计算成员执行复杂成员检索,从而轻松的处理层次结构和集合
20. IIF函数
MDX中IIF函数可用于执行简单的是或否决策
IIF(expression,‘YES’,‘NO’)
21. 生成MDX中的高速缓存
MDX常用多维数据集切片装载到内存,对其进行高速缓存以达到更快检索的目的。
(1)可使用CREATE CACHE语句
(2)可使用WITH语句
WITH CACHE AS ‘(<Set>)’
<Set>是用来创建高速缓存的集合表达式,规则如下:
每个<set>必须包含仅来自一个维度的成员。各个成员必须互不相同
各个<Set>必须来之于不同的维度
<Set>不能包含度量值
22. 生成MDX中的计算单元
计算单元功能就是通过定义单元的特定切片,并将公式应用到该切片内的各个单元。
使用CREATE CELL CALCULATION语句创建。
如果对于现有数据集,ALTER CUBE语句可用来添加计算单元。
WITH CELL CALCULATION <formula_name> FOR '(<calculation_subcube>)' AS '<calculation_formula>'
<formula_name>是计算单元的名称。
<calculation_subcube>包含一列正交的,单维度的MDX集合表达式,每个表达式都必须解析为下列集合分类之一:
1. 空集合:此情况集合被忽略。
2. 单个成员集合: 解析为单个成员集合表达式
3. 级别成员集合:
4. 后代的集合:???
23. 在MDX中使用用户定义函数
无参数调用:
MyNewFunction()
有参数调用:
MyNewFunctionWithParms("Parameter1",2,800)
24. USE LIBRARY语句
用USE LIBRARY 语句执行外部库的装载。用户自定义函数都必须与COM类相关联,这些类通常以Microsoft ActiveX动态链接库(DLL)的形式提供
***不带参数的USE LIBRARY语句将注销所有的函数库***
25. Drop LIBARARY语句
用于卸载特定或者所有的库
DROP LIBRARY “库名”
26. 创建用户自定义函数
用户自定义函数可支持COM借口的任何编程语言创建
接受任何可强制转换的字符串,数字或者字符串数组或数组数组的参数
用户自定义类型或对象引用不能作为参数
数组可以作为参数
27. 使用回写??????
将信息写入MDX中的写启用多维数据集的功能
1. 最低级别的成员回写
指维度中与该维度最低定义级别相关联的成员。
2. 聚合级别的成员回写
聚合级别成员的值取决于与聚合级别以下级别相关联的成员的值。
28. 使用DRILLTHROUGH检索数据源??????
DRILLTHROUGH语句从源数据中检索行集。(赚取)
可以使用AllowDrillTHrough 和DrillthroughColumns属性
DRILLTHROUGH [MAXROWS <positive number>] [FIRSTROWSET <positive number>]
29. MDX中的注释
// C++风格
-- SQL风格
/*..*/ C风格
注释加入了信息,却不影响性能