




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在关系数据库中使用SQL语言来查询、管理和操作数据库中的数据。在SQLServer中使用MDX语句来进行多维数据库的操作和管理,MDX不但可以用在SSAS中进行多维数据库的查询管理,也可使用在SSIS和SSRS中分别辅助处理ETL过程和报表开发过程。因为MDX语句没有标准化,不同的BI解决方案提供使用不同的多维数据查询技术,所以SQLServer中的MDX语言只能在SQLServer中使用,如果要进行其它数据库如ORACLE,Hyperion的查询,就要了解与其相对应的MDX,可能在语法或一些用法上不同于SQLServer中的MDX。本文针对的是SQLServer中的MDX。本文以一个简单的MDX查询开始,分别解析这个查询的各个部分,以此来学习MDX语法。但是在这之前首先要介绍使用的案例多维数据集。一.案例所使用的多维数据集维度:
图一:维度信息度量值:
图二:度量信息
其中MaxUnitsOrdered和TotalUnitsOrdered两个度量是导出度量,即通过命名计算得到的度量。维度结构:
图三:Product维度结构
图四:Store维度结构
图五:TimeByDay维度结构,即时间维度
图六:多维数据集总体结构
二.一个完整的MDX查询
例一:一个简单的MDX语句
SELECTNONEMPTY{[Product].[ProductCategory-ProductClass].[产品目录]}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地区]}ONROWSFROM[Foodmart多维数据立方]WHERE[TimeByDay].[month_of_year].&[3]
图七:例一的MDX查询得到的结果
a)
SELECT子句SELECT子句在MDX中也叫做查询器轴,在SELECT语句中总共支持128个轴(即编号从0到127)。其中前五个轴(即编号0-4)有内置命名,分别是:COLUMNS、ROWS、PAGES、CHAPTERS、SECTIONS。除了这五个轴可以通过命名和编号来访问以外,其它的轴(5-127)都只能通过编号来访问。在SSAS中通过MDX只能直接查看两个轴的信息,也就是说在SSAS中执行MDX的时候,这个MDX只能有两个轴,即COLUMNS和ROWS,如果有更多的轴在SSAS中是无法显示的。只能通过透视数据表或通过编程的方式来浏览。
在例一的MDX中,包含COLUMNS和ROWS两个轴。在COLUMNS轴中,[Product].[ProductCategory–ProductClass].[产品目录]表示了访问的元组,这个元组的含义是:Product维度的名为ProductCategory–ProductClass的层次下的名为“产品目录”这个等级所包含的所有成员。[Product]是维度名称,[ProductCategory–ProductClass]是层次名称,[产品目录]是等级名称。最外面的大括号表示集合,即所有[Product].[ProductCategory–ProductClass].[产品目录]元组所组成的集合。由此可以看出MDX中轴的访问顺序是:维度层次等级成员。NONEMPTY的作用是过滤空值结果。查询结果如图七。
ROWS轴的结构与COLUMNS相同,所有128个轴的基本访问规则都是一样。每个轴之间用逗号分隔。另外,在同一个轴中不能出现不同维度的元组。如下:
例二:错误的MDX(一个轴中包含两个维度的元组)
SELECTNONEMPTY{[Product].[ProductCategory-ProductClass].[产品目录],[Store].[StoreName].[StoreName]}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地区]}ONROWSFROM[Foodmart多维数据立方]WHERE[TimeByDay].[month_of_year].&[3]
图八:错误信息例二是一个错误的MDX查询,因为在COLUMNS轴中出现了两个维度的元组,这样的查询在SSAS中会执行的时候会报“函数中指定的两个集具有不同的维数。”这样的异常信息(如图八)。可以这样理解这种错误:多维数据集就像是一个个的正方体,正方体的每一条边都是一个维度,每一条边也都只能表示一个维度,如果让一条边表示两个维度自然就会出错,这也是不符合逻辑的。
如果要将不同维度的元组集合放到同一个轴中就要使用叉积,即不同维度之间的笛卡尔积。叉积的使用有几种不同的写法,可以使用CROSSJOIN函数、可以将集合与集合用*号相乘,不过最简单的就是直接把同一个轴中的不同维度用小括号括起来。可以把例二修改一下:
例三:修改后的例二,通过叉积使得可以在一个轴中观察不同维度的数据
SELECTNONEMPTY{([Product].[ProductCategory-ProductClass].[产品目录],[Store].[StoreName].[StoreName])}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地区]}ONROWSFROM[Foodmart多维数据立方]WHERE[TimeByDay].[month_of_year].&[3]
图九:叉积查询结果
例三就可以正常的运行而不会出现例二的错误了,不同之处仅仅是为两个不同的维度加了个小括号。加了小括号后元组的结构就发生了变化,不再是只由Product维度构成,而是由Product和Store两个维度共同构成。小括号中可以包含多个维度或者是同一维度不同层次的元组,但是不能有相同维度的员一层次存在。如果存在某两个相同维度的同一层次,在执行MDX的时候会报“…层次结构在CROSSJOIN函数中使用了多次”这样的异常信息。
下面再举出另外两种CROSSJOIN的用法:
例四:另一种叉积的用法SELECTNONEMPTY{CROSSJOIN([Product].[ProductCategory-ProductClass].[产品目录],[Store].[StoreName].[StoreName])}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地区]}ONROWSFROM[Foodmart多维数据立方]WHERE[TimeByDay].[month_of_year].&[3]
例五:第三种叉积用法SELECTNONEMPTY{{[Product].[ProductCategory-ProductClass].[产品目录]}*{[Store].[StoreName].[StoreName]}}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地区]}ONROWSFROM[Foodmart多维数据立方]WHERE[TimeByDay].[month_of_year].&[3]
例四和例五都是叉积的使用方法,可以得到和例三相同的结果。因为在SSAS中不能直接查看两个轴以上的查询,但是可以使用叉积的方式将三个轴以上的查询“平面化”到两个轴中。这样在理论上就可以直接在SSAS中查看多个轴的数据。这里我之所以要讲“理论上”,是因为叉积这种运算复杂度相当地高,如果将多个维度的元组集合进行叉积的话可能等待很久也得不到结果,计算机甚至会因为大量的运算而中断程序。所以在实际中要尽量控制这样的用法。如果要用最好首先将数据控制在一个非常有限的范围之内,减少叉积带来的运算开消。
b)
FROM子句FROM子句表示MDX查询的来源多维数据集,FROM子句中只能包含一个多维数据集,也就是说同一个MDX查询只能来自于同一个多维数据集,而不能像SQL查询一样将多个数据表连接起来。另外,MDX中的FROM子句也可以是另一个MDX查询得到的一个子多维数据集,这样就可以更加复杂的MDX查询。如下面的例六所示:
例六:包含子多维数据集的复杂查询
SELECT{[Product].[ProductCategory-ProductClass].[产品目录]}*{[Store].[StoreName].[StoreName]}ONCOLUMNS,{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地区]}ONROWSFROM(SELECT({[TimeByDay].[quarter].&[Q1]})ONCOLUMNSFROM[Foodmart多维数据立方])
c)
WHERE子句WHERE子句的另一个名称是切片器轴,顾名思义它的作用主要就是对多维数据集进行切片和切块操作,限制数据集的大小。看下面的两个例子:
例七:多维数据集切片操作SELECT{[Product].[ProductCategory-ProductClass].[产品目录]}*{[Store].[StoreName].[StoreName]}ONCOLUMNS,{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地区]}ONROWSFROM[Foodmart多维数据立方]WHERE([Store].[StoreManager].&[Byrd])
图十:切片得到的结果
例七在前面叉积例子的基础上进行了切片操作,将数据限制在了StoreManager为Byrd的范围内。例七的查询得到的结果数据集从逻辑上包含三个轴,即产品目录、门店名称、地区编号。经过切片后,保留了产品目录和门店名称两个轴,另一个地区因为切片操作只剩下Byrd所对应的地区。查询结果如图十所示。
例八:多维数据集切块操作SELECTNONEMPTY{[Product].[ProductCategory-ProductClass].[产品目录]}*{[Store].[StoreName].[StoreName]}ONCOLUMNS,NONEMPTY{[Store].[SalesCountry-SalesRegion-SalesDistrictId-Region].[地区]}ONROWSFROM[Foodmart多维数据立方]WHERE([TimeByDay].[quarter].&[Q1]:[TimeByDay].[quarter].[Q2],[Store].[Store].&[18]:[Store].[Store].&[20],[Product].[ProductCategory].&[CannedClams]:[Product].[ProductCategory].&[CannedSardines])
图十一:切块所得到的结果
例八在前面叉积的基础上进行了切块操作,分别在时间维度、门店维度、产品维度上进行了限制。图十一是这个MDX查询所得到的结果。
d)
WITH子句WITH子句用于创建临时的命名计算成员及命名集合。通过WITH子句创建的命名计算成员和命名集合其生命周期有限,只限于与WITH子句相邻的MDX查询,当MDX查询结束后,用WITH子句创建的命名计算或命名集合也随之失效。如果要创建在整个会话过程中都保持有效的命名计算和命名集合的话,就要使用CREATEMEMBER和CREATESET语句。下面的例子演示了临时命名计算和临时命名集合的用法和查询结果:
例九:临时命名计算和临时命名集合的使用WITHMEMBER[Measures].[AvgOfUnitsShipped]AS'AVG({[Product].[Product].[Product]},[Measures].[UnitsShipped])',FORMAT_STRING='###,###,###,##0.00'SET[CROSSSET_StoreName]AS'{[Store].[StoreName].[StoreName].[Store1]}'SET[CROSSSET_TIME]AS'{[TimeByDay].[month_of_year].[month_of_year]}'SELECTNONEMPTY{[Measures].[AvgOfUnitsShipped]}ONCOLUMNS,NONEMPTY[CROSSSET_StoreName]*[CROSSSET_TIME]ONROWSFROM[Foodmart多维数据立方]
图十二:临时命名计算和命名集合的查询结果
WITHMEMBER语句最后的FORMAT_STRING是用于格式化数据结果的,在例九中,我把得到的平均值结果格式化为了保留两位小数,并进行千分位分隔。其它的常用格式符还有PERCENT、CURRENCY等。
三.常用函数大多数聚合函数都有两个或两个以上的参数,其中第一个参数通常是用于计算的集合即进行计算的范围,后面的参数通常是用于计算的度量或数据。1.
AVG函数:a)
功能:求平均值b)
用法:
AVG({[Product].[Product].[Product]},[Measures].[UnitsShipped])
2.
MAX函数:a)
功能:求集合中的最大值。b)
用法:
MAX({[Product].[Product].[Product]},[Measures].[UnitsShipped])3.
MIN函数:a)
功能:求集合中的最小值。b)
用法:
MIN({[Product].[Product].[Product]},
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度投资理财代理服务合同
- 二零二五年度吊车安全操作规程制定及执行合同
- 二零二五年度冬季劳务扫雪环境保护协议
- 2025年度正规货车驾驶员劳动合同及货运业务操作规范合同
- 二零二五年度扶贫项目风险防范与应急处理合作协议
- 二零二五年度合同纠纷赔偿调解服务协议
- 二零二五年度名人房产销售代理合同范本
- 2025年度智能制造股权抵押贷款合同
- 2025年度电子商务平台合作解除终止范本
- 二零二五年度企业劳动合同解除与离职员工就业援助服务协议
- 《概率论与数理统计》课件第八章 假设检验
- 山东工商学院马克思主义基本原理期末复习题及参考答案
- 2023年济南工程职业技术学院单招职业技能考试题库及答案解析word版
- 文献检索与论文写作-文献检索与科技论文写作138课件
- 10KV开关柜教学讲解课件
- 废橡胶处理协议书范本
- 增额终身寿险销售逻辑
- GB/T 8813-2020硬质泡沫塑料压缩性能的测定
- GB/T 15057.2-1994化工用石灰石中氧化钙和氧化镁含量的测定
- 洁净厂房监理实施细则
- 哈工大研究生课程-高等结构动力学-第四章课件
评论
0/150
提交评论