MDX多维表达式学习_第1页
MDX多维表达式学习_第2页
MDX多维表达式学习_第3页
MDX多维表达式学习_第4页
MDX多维表达式学习_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

徐俊刚(xujg@)数据仓库2009年9月——2009年11月MDX概述MDX基本概念MDX与SQL的比较基本MDX高级MDX多维表达式(MDX)

第5章MDX概述1MDX起源1.1背景SQL对多维数据查询和统计具有一定局限性Microsoft定义和推出MDX事例应用程序,存在于MicrosoftSQLServerAnalysisService中MDX语言用于在Microsoft®SQLServer2000/2005AnalysisServices中操作多维信息。MDX概述1MDX概述1.2概述MDX(MultidimensionalExpressions)是一种语法,支持多维对象与多维数据的定义和操作MDX在很多方面与SQL语法相似,但它不是SQL语言的扩展;事实上,MDX所提供的一些功能也可由SQL提供,尽管不是那么有效或直观。每个MDX查询都要求有SELECT子句、FROM子句和WHERE子句。MDX还提供了可靠的函数集,用来对所检索的数据进行操作,同时还具有用用户定义函数扩展MDX的能力。MDX提供管理数据结构的DDL语法,其中有用于创建(和删除)多维数据集、维度、度量值以及它们的坐标对象的MDX命令。MDX基本概念2单元、元组和集合2.1SQL从表返回二维数据子集,而MDX从多维数据集返回多维数据子集。以下元组标识其中值为240的单元:(路线.[东半球].[非洲],时间.[下半年].[第四季度],源.[非陆地].[航空],度量值.包)元组唯一标识多维数据集中的一部分;它不必指某个特定单元(切片或切块)(路线.[东半球])(时间.[下半年],路线.[西半球])元组的有序集合称为集合

{(时间.[上半年].[第一季度]),(时间.[下半年].[第三季度])}MDX基本概念2单元、元组和集合2.1MDX基本概念2轴维度和切片器维度2.2定义SELECT语句用来选择要返回的维度和成员,称之为轴维度。WHERE语句用来将返回的数据限定为特定维度和成员条件,称之为切片器维度。轴维度预期返回多个成员的数据,而切片器维度预期返回单个成员的数据。MDX基本概念2其他基本概念2.3计算成员计算成员不是基于数据、而是基于MDX中估值表达式的成员用户定义函数用户可以创建和注册自己的函数,这些函数对多维数据进行操作,同时按MDX语法接受参数并返回值。PivotTable服务MDX数据定义和操作服务通过PivotTable服务提供。PivotTable服务用于本地多维数据集的定义和操作,使用此多维数据集可以多维格式在本地存储数据。MDX和SQL的比较3MDX相对于SQL的主要特点3.1定义专门检索具有几乎任意多个维度的多维数据结构中的数据,MDX在查询中则可处理一个、两个、三个或更多的维度。在MDX中SELECT子句可用于定义几个轴维度,而WHERE子句可用来把多维数据限制于特定的维度或成员。WHERE子句用于提供查询所返回的数据切片。WHERE子句中的各个成员标识来自不同维度的数据的不同部分MDX查询的创建者通常将多维数据集的结构形象化并加以定义,并且编写对单个多维数据集的查询对该结构进行填充MDX结果集的视觉形象不直观。因为多维结果集可以有三个以上的维度,所以将该结构形象化比较困难基本MDX4基本MDX查询4.1SELECT[<axis_specification>[,<axis_specification>...]]FROM[<cube_specification>][WHERE[<slicer_specification>]]

要指定数据集,MDX查询必须包含有关下列各项的信息:(1)轴的数目。最多可在MDX查询中指定128个轴。(2)要包括在MDX查询的各个轴上的来自各个维度的成员。(3)设置MDX查询上下文的多维数据集的名称。(4)来自切片器维度的成员,在该维度上对来自轴维度的成员进行数据切片基本MDX查询示例:别名SELECT{[Measures].[UnitSales],[Measures].[StoreSales]}ONCOLUMNS,{[Time].[1997],[Time].[1998]}ONROWSFROMSalesWHERE([Store].[USA].[CA])4基本MDX查询4.1基本MDX4基本MDX查询4.1基本MDXMDXSELECT语句的语法格式与SQL语法类似;可是用户将注意到以下几个显著区别:(1)MDX语法通过用花括号({和}字符)括住元组或成员来辨别集合。(2)MDX查询在SELECT语句中最多可以有128个轴维度,但只有前5个轴有别名。轴可以用其在MDX查询中的顺序位置或者用其别名(如果给它指派了别名的话)来引用。SELECT{[Measures].[UnitSales],[Measures].[StoreSales]}ONAXIS(0),{[Time].[1997],[Time].[1998]}ONAXIS(1)FROMSalesWHERE([Store].[USA].[CA])(3)如同SQL查询一样,FROM子句为MDX查询指定数据的源(4)WHERE子句用于描述切片器维度。

成员:下图加入阴影以表示“时间.[下半年].[第三季度]”成员。4成员示例4.2基本MDX引用成员的可选方法是引用成员键。成员键由维度用来专门标识给定成员。成员键:用&字符将成员键与成员名区别开[时间].[下半年].&[Q4]("第四季度"成员的成员键Q4)引用成员键确保在可更改维度中以及在具有非唯一成员名的维度中成员的正确标识。可用成员名或其成员键引用某个成员。上一示例中用其成员名“第四季度”引用“时间”维度中的成员。4成员名和成员键4.3基本MDX可将成员创建为MDX查询的一部分,以使返回的数据基于估值表达式,而不是要查询的多维数据集中所存储的数据,这些成员称为计算成员。如以下示例所示:WITHMEMBER[Measures].[PackagesForecast]AS'[Measures].[Packages]*1.1'4计算成员4.4基本MDXMDX提供许多函数来从其它MDX实体(如维度和级别)检索成员//FirstChild

函数允许从给定维度或级别检索所有的成员//下列两式具有相同效果显式声明:时间.[上半年]函数调用:时间.FirstChild//"时间"维度的第一个子代成员4成员函数4.5基本MDX元组用于定义来自多维数据集的数据切片或切块;它由来自一个或多个维度的单个成员的有序集合组成。元组用于标识来自多维数据集的特定多维数据块;元组是一种成员向量;请把元组看作基础数据库中的一个或多个记录上图表现(时间.[下半年],源.非陆地.航空)元组。由来自不止一个维度的成员组成,则元组所表示的成员必须括在圆括号内4元组4.6基本MDX集合是零个、一个或多个元组的有序集合。集合最常用于在MDX查询中定义轴维度和切片器维度,并且可能只具有单个元组或可能在某些情况下为空。集合指以元组表示的一组成员组合,或指集合中的元组所代表的单元中的值(视使用的上下文而定)元组用花括号括起来以构造集合示例{(时间.[上半年],源.非陆地.航空),(时间.[下半年],源.非陆地.海路)}{时间.[下半年],时间.[下半年]}//允许同一个元组重复出现4集合4.7基本MDX聚合函数冒号运算符使用成员的自然顺序创建集合两边的成员包含在结果集内:{[第一季度]:[第四季度]}集合和维数集合的维数用其中各个元组的维数表达。集合内元组的顺序非常重要下例不能作为集合使用:集合中的元组必须具有相同的维顺序{(时间.[下半年],源.非陆地.航空),(源.非陆地.航空,时间.[下半年])}4聚合函数4.8基本MDX指定轴维度的内容<axis_specification>语法可分解为:<axis_specification>::=<set>ON<axis_name><axis_name>::=COLUMNS|ROWS|PAGES|SECTIONS|CHAPTERS|AXIS(<index>)每个轴维度与一个数字相关联:

0对应于x轴,1对应于y轴,2对应于z轴,等等。

<index>值是轴号。对于前5个轴,COLUMNS、ROWS、PAGES、SECTIONS和CHAPTERS这几个别名可分别代替AXIS(0)、AXIS(1)、AXIS(2)、AXIS(3)和AXIS(4)使用。4轴维度和切片器维度4.9基本MDX指定切片器维度的内容(1)显式指派给轴的维度是切片器维度(2)假定未显式指派给轴的维度是切片器维度,用其默认成员进行筛选。(3)如果未显式指定默认成员,如果存在“(全部)”级别,则默认成员为“全部”成员,否则为最高级别的任意成员。("全部"成员的名称不必为"全部"。)4轴维度和切片器维度4.9基本MDXMDX查询提供上下文:FROM<<cube_specification>><<cube_specification>>由单个多维数据集的名称完成。这并未限制用户一次使用多个多维数据集;可以使用LookupCube函数来从多维数据集上下文以外的多维数据集检索数据。与SQL不同,MDX查询中的FROM子句通常不允许连接:FROMSalesCube,OtherCube4建立多维数据集上下文4.10基本MDX1.成员属性的使用各个元组中每个成员的一些基本信息,如成员名、父级别、子代数目等等。这些信息即称为成员属性。成员属性可视为存储于单个维度上按维度组织的数据。例如,若要创建StoreName级别中成员的成员属性StoreType,须确保StoreType列与StoreName列在相同的表中,然后将StoreType作为成员属性插入到StoreName级别中。5创建和使用属性值5.1高级MDX(1)DIMENSIONPROPERTIES关键字SELECT[<axis_specification>[,<axis_specification>...]]FROM[<cube_specification>][WHERE[<slicer_specification>]]<axis_specification>::=<set>[<dim_props>]ON<axis_name><dim_props>::=[DIMENSION]PROPERTIES<property>[,<property>...]property语法的分解会因所查询的属性而有所不同。维度和级别的内在成员属性前必须加上维度和/或级别的名称。成员的内在成员属性不能由维度名或级别名限定。自定义成员属性前应加上其所驻留的级别的名称。5创建和使用属性值5.1高级MDXSELECT//Members

函数是最常用的集合函数之一,//返回维度、级别或层次结构中成员的集合

CROSSJOIN(年,(销售量,预算销售量))ONCOLUMNS,NONEMPTY产品.MEMBERS//关键字,非空

DIMENSIONPROPERTIES产品.SKU,产品.SRPONROWSFROMSalesCubeWHERE(一月,销售代表.[All],地理.美国)返回以下数据集:5创建和使用属性值5.1高级MDX(2)Properties函数成员属性还可通过使用MDX中的Properties函数进行检索。例如,下面的MDX查询使用WITH关键字来创建包含[StoreSqft]成员属性的计算成员:WITH//生成计算成员

MEMBER[度量值].[商店规模]AS‘Val(商店.当前成员.属性(“商店平方米”))’//VB库中的函数SELECT{[度量值].[单个销售额],[度量值].[商店规模]}ONCOLUMNS,{[商店].[商店名称].成员}ONROWSFromSales5创建和使用属性值5.1高级MDX可以生成一个与下表中的结果集类似的结果集:请注意MDX查询示例中Val()函数的使用。Properties函数是字符串类型的函数;所有用Properties函数检索的成员属性均将强制转换为字符串。5创建和使用属性值5.1高级MDX(3)内在维度和级别成员属性所有维度和级别均支持下面所列的内在成员属性。这些成员属性在特定维度或级别的上下文中使用,并且为指定维度或级别的每个成员提供值。例如,在多维表达式(MDX)查询中指定下列语句:[Sales].Name//返回级别、维度、成员或层次结构的名称返回[Sales]维度的各个引用成员的名称:属性描述ID成员的内部维护IDKey存储于MEMBERS架构行集的MEMBER_KEY列中成员的值Name成员的名称5创建和使用属性值5.1高级MDX维度成员属性前是应用属性的维度的名称下例示范了正确的语法:DIMENSIONPROPERTIES<<Dimension>>.ID

级别成员属性前可加上级别名,或为附加规范加上维度和级别名,如下所示:DIMENSIONPROPERTIES[<<Dimension>>.]<<Level>>.ID5创建和使用属性值5.1高级MDX(4)内在成员属性内在成员属性不能为特定维度或级别加以请求,而应用于多维表达式(MDX)查询中轴维度的所有成员例如,在MDX查询中指定下列语句:PROPERTIESDESCRIPTION返回对轴维度中各个成员的描述。5创建和使用属性值5.1高级MDX下面列出所支持的内在成员属性及描述:CALCULATION_PASS_DEPTH:仅用于计算单元。计算公式的传递深度,此属性确定解析计算公式需要多少个传递。有关传递次序的更多信息,请参见理解传递次序和求解次序。

CALCULATION_PASS_NUMBER:仅用于计算单元。计算公式的传递号,此属性确定计算公式将分别在哪个传递上开始赋值和结束计算。该属性的默认值为1;其最大值为65,535。有关传递次序的更多信息,请参见理解传递次序和求解次序。

...5创建和使用属性值5.1高级MDX(5)自定义成员属性自定义成员属性可添加到维度中的特定命名级别中。自定义成员属性不能添加到维度的“(全部)”级别,或添加到维度本身用来引用自定义成员属性的语法类似于用来引用内在级别成员属性的语法,如下列示例所示:PROPERTIES[<Dimension>.]<Level>.<CustomMemberProperty>5创建和使用属性值5.1高级MDX2.单元属性的使用

MDX单元属性所包含的信息,是单元的内容和格式的信息。下例显示MDXSELECTCELLPROPERTIES关键字语法。SELECT[<axis_specification>[,<axis_specification>...]]FROM[<cube_specification>][WHERE[<slicer_specification>]][<cell_props>]<cell_props>::=CELLPROPERTIES<property>[,<property>...]5创建和使用属性值5.1高级MDX下面列出用于<property>值的内在单元属性BACK_COLOR:显示VALUE或FORMATTED_VALUE属性的背景颜色。CELL_EVALUATION_LIST:适用于单元的以分号分隔的一列求值公式,按从最低到最高的求解次序排列。CELL_ORDINAL:数据集中单元的序列号。FORE_COLOR:显示VALUE或FORMATTED_VALUE属性的前景颜色。

5创建和使用属性值5.1高级MDX

默认情况下,如果未用CELLPROPERTIES关键字,则返回的单元属性为VALUE、FORMATTED_VALUE和CELL_ORDINAL(按此顺序)。如果使用了CELLPROPERTIES关键字,则只返回用此关键字显式声明的单元属性。下例示范了MDX查询中CELLPROPERTIES关键字的使用:SELECT{[Measures].[UnitSales],[Measures].[StoreSize]}ONCOLUMNS,{[Store].[StoreName].Members}ONROWSFROMSalesCELLPROPERTIESVALUE,FORMATTED_VALUE,FORMAT_STRING,FORE_COLOR,BACK_COLOR5创建和使用属性值5.1高级MDX3.使用CustomMemberOptions属性使用维度编辑器或多维数据集编辑器的CustomMemberOptions属性,可通过AnalysisManager设置单元属性。

CustomMemberOptions属性接受每个成员的列引用,该引用包含以逗号分隔的单元属性列表。单元属性以字符串表达式的形式表示,如例所示。FORE_COLOR='255',BACK_COLOR='65535'示例为指定成员提供一个带红色前景的黄色背景。5创建和使用属性值5.1高级MDX4.使用FORMAT_STRING单元属性

FORMAT_STRING单元属性用于格式化VALUE单元属性,以创建FORMATTED_VALUE单元属性值。

FORMAT_STRING单元属性对于字符串和数字原始值均能处理,它对该值应用格式表达式以返回FORMATTED_VALUE单元属性的格式化值。5创建和使用属性值5.1高级MDX5.使用字符串值符号字符串的格式表达式可以是一部分,也可以是由分号(;)分隔开的两部分。一部分格式应用于所有字符串值。两部分时第一部分应用于字符串数据,而第二部分应用于空值和零长度字符串("")。(1)@字符占位符。它显示一个字符或一个空格。(2)&字符占位符。它显示一个字符或什么都不显示。(3)<强制小写。以小写格式显示所有字符。(4)>强制大写。以大写格式显示所有字符。(5)!强制从左到右填充占位符。5创建和使用属性值5.1高级MDX6.使用数字值数字的用户定义格式表达式可以有一到四个由分号分隔的部分。如果格式参数包含一个命名数字格式,则只允许有一个部分。一部分:格式表达式应用于所有值。两部分:第一部分应用于正值和零,第二部分应用于负值。三部分:第一部分应用于正值,第二部分应用于负值,第三部分应用于零。四部分:第一部分应用于正值,第二部分应用于负值,第三部分应用于零,第四部分应用于空值。下例具有两个部分:"$#,##0;($#,##0)"如果包含两个紧挨着的分号,则缺少的部分用正值的格式打印。"$#,##0;;\Z\e\r\o"5创建和使用属性值5.1高级MDX7.使用FORE_COLOR和BACK_COLOR单元属性以MicrosoftWindows操作系统红-绿-蓝(RGB)格式存储单元的文本和背景的颜色信息。范围为0到16,777,215(&H00FFFFFF)

数字的高位字节始终等于0;低位的3个字节,从最低位字节到最高位字节分别决定了红色、绿色和蓝色的数量。红色、绿色和蓝色成分分别由一个0到255(&HFF)之间的数字表示。例如,值255(&H000000FF)代表红色,值65280(&H0000FF00)代表绿色,而值16711680(&H00FF0000)代表蓝色。5创建和使用属性值5.1高级MDXMDX中的命名集可能是长而复杂并且不易理解的声明命名集是一个与别名相关联的集合表达式。命名集可将集合中的成员或函数合并。命名集是维度成员集或所创建的可以再度使用的集合表达式。WITHSET[ChardonnayChablis]AS'{[Product].[All……..…………..SELECT[ChardonnayChablis]ONCOLUMNS,{Measures.[UnitSales]}ONROWSFROMSales5生成MDX中的命名集5.2高级MDX使用WITH创建命名集[WITH<formula_specification>][,formula_specification>]SELECT[<axis_specification>[,<axis_specification>...]]FROM[<cube_specification>][WHERE[<slicer_specification>]]<formula_specification>::=SET<set_name>AS'<set>'<set_name>参数包含命名集的别名。<set>参数包含命名集别名所指的集合表达式。5生成MDX中的命名集5.2高级MDX

示例使用Filter、CurrentMember、Name和InStr函数来创建[ChardonnayChablis]命名集://VB:InStr([start,]string1,string2[,compare])//返回:指定一字符串在另一字符串中最先出现的位置。//CurrentMember:MDX表达式,拒绝对度量值“chardonnay”//的单元的访问,但允许对所有其它度量值的单元的访问//Filter(«Set»,«SearchCondition»)

//返回根据搜索条件对指定集合进行筛选所得到的集合。WITHSET[ChardonnayChablis]AS'Filter([Product].Members,(InStr(1,[Product].CurrentMember.Name,"chardonnay")<>0)OR(InStr(1,[Product].CurrentMember.Name,"chablis")<>0))'SELECT[ChardonnayChablis]ONCOLUMNS,{Measures.[UnitSales]}ONROWSFROMSales1.使用WITH创建计算成员[WITH<formula_specification>][,<formula_specification>]SELECT[<axis_specification>[,<axis_specification>...]]FROM[<cube_specification>][WHERE[<slicer_specification>]]<formula_specification>::=MEMBER<member_name>AS'<value_expression>'[,SOLVE_ORDER=<unsignedinteger>][,<cell_property>=<value_expression>...](1)<member_name>值是计算成员的完全合法名称,<value_expression>在经过计算后,将返回计算成员的值。(2)使用SOLVE_ORDER关键字指定计算成员的求解次序(3)<cell_property>值中提供单元属性的名称和在<value_expression>值中提供单元属性值,可随意指定计算成员内在单元属性的值。5生成MDX中的计算成员5.3高级MDX

下例的MDX查询示例定义了两个计算成员。第一个计算成员[Measures].[StoreType]用于表示StoreType成员属性。第二个计算成员[Measures].[ProfitPct]用于计算给定商店的总利润率,并将其表示为格式化的百分比值。WITHMEMBER[Measures].[StoreType]AS'[Store].CurrentMember.Properties("StoreType")',SOLVE_ORDER=2MEMBER[Measures].[ProfitPct]AS'Val((Measures.[StoreSales]-Measures.[StoreCost])/Measures.[StoreSales])',SOLVE_ORDER=1,FORMAT_STRING='Percent'SELECT{[Store].[StoreName].Members}ONCOLUMNS,{[Measures].[StoreSales],[Measures].[StoreCost],[Measures].[StoreType],[Measures].[ProfitPct]}ONROWSFROMSales

计算成员可在层次结构的任意位置创建。下例MDX查询示例定义作为[BeerandWine]成员的子成员创建的计算成员,以确定给定商店的啤酒和果酒(BeerandWine)的单位销售额是否至少为100.00:WITHMEMBER[Product].[BeerandWine].[BigSeller]AS'IIf([Product].[BeerandWine]>100,"Yes","No")’SELECT{[Product].[BigSeller]}ONCOLUMNS,{Store.[StoreName].Members}ONROWSFROMSales5生成MDX中的计算成员5.3高级MDX使用同一MDX中其它计算成员的计算成员:WITHMEMBER[Measures].[ProfitPct]AS'Val((Measures.[StoreSales]-Measures.[StoreCost])/Measures.[StoreSales])',SOLVE_ORDER=1,FORMAT_STRING='Percent'MEMBER[Measures].[ProfitValue]AS'[Measures].[StoreSales]*[Measures].[ProfitPct]',SOLVE_ORDER=2,FORMAT_STRING='Currency'SELECT{[Store].[StoreName].Members}ONCOLUMNS,{[Measures].[StoreSales],[Measures].[StoreCost],[Measures].[ProfitValue],[Measures].[ProfitPct]}ONROWSFROMSales第二个计算成员[Measures].[ProfitValue]使用第一个计算成员[Measures].[ProfitPct]中创建的值来生成自己的值。2.在计算成员中使用函数(1)算术运算符:+,-,*,/(2)比较运算符:>,<,>=,<=,<>,=(3)按位运算符:AND,OR,NOT,XOR(与C相同)(4)集合运算符:<<Set1>>+<<Set1>>对两个集合执行Union函数。<<Set1>>*<<Set2>>对两个集合执行Crossjoin函数。<<Set1>>-<<Set2>>对两个集合执行Except函数。<<Member1>>:<<Member2>>创建自然排序集合,并将两个成员作为终结点,这两个指定成员间的所有成员作为集合的成员包括其中。5生成MDX中的计算成员5.3高级MDX(5)数值函数如下面的MDX查询示例所示,当Aggregate函数与产生总和的度量值相组合时,功能尤其强大:WITHMEMBER[Time].[1stHalfSales]AS'Aggregate({Time.[Q1],Time.[Q2]})'MEMBER[Time].[2ndHalfSales]AS'Aggregate({Time.[Q3],Time.[Q4]})',MEMBER[Time].[Difference]AS'Time.[2ndHalfSales]-Time.[1stHalfSales]',SELECT{[Store].[StoreState].Members}ONCOLUMNS,{Time.[1stHalfSales],Time.[2ndHalfSales],Time.Difference}ONROWSFROMSalesWHERE[Measures].[StoreSales]

查询产生了各州的店面销售额总和,带有前两个计算成员用Aggregate函数所提供的上半年和下半年的聚合,以及由第三个计算成员提供的二者的差额。5生成MDX中的计算成员5.3高级MDXMDX还提供了一列统计函数,以处理例程统计计算,例如,Median函数计算集合内的中值,以下MDX查询:WITHMEMBER[Time].[1stHalfSales]AS'Sum({[Time].[Q1],[Time].[Q2]})'MEMBER[Time].[2ndHalfSales]AS'Sum({[Time].[Q3],[Time].[Q4]})'MEMBER[Time].[Median]AS'Median(Time.Members)'SELECTNONEMPTY{[Store].[StoreName].Members}ONCOLUMNS,{[Time].[1stHalfSales],[Time].[2ndHalfSales],[Time].[Median]}ONROWSFROMSalesWHERE[Measures].[StoreSales]在本示例中,除了[Time].[1stHalfSales]和[Time].[2ndHalfSales]计算成员提供的各个商店的上半年和下半年的店面销售额的聚合之外,还有[Time].[Median]计算成员提供的各个商店店面销售额的中值。5生成MDX中的计算成员5.3高级MDX(6)字符串函数

MDX提供许多字符串函数,不只是为了MDX表达式内的字符串处理,还为了支持MDX中用户定义函数。例如,MemberToStr函数将某成员引用转换为MDX格式的字符串以用于用户定义函数,因为用户定义函数不接受来自MDX的对象引用。5生成MDX中的计算成员5.3高级MDX(7)集合函数集合函数用于在MDX中返回集合,为用户提供方便生成动态定义的集合和快速创建可再次使用的命名集的功能。

Members函数是最常用的集合函数之一,它将级别或维度的所有成员(计算成员除外)作为一个集合返回。下面的MDX查询示例示范了工作中的Members函数。SELECTNONEMPTY{[Store].[StoreName].Members}ONCOLUMNS,{Measures.[StoreSales]}ONROWSFROMSales

本MDX查询示例返回了Sales多维数据集中的各个商店的总销售额数字。如果不用Members函数,则不得不显式输入各个商店名称,以使其完成本MDX查询示例的功能。5生成MDX中的计算成员5.3高级MDX(8)元组函数如同集合函数,元组函数用于在MDX中返回元组。元组函数还用于辅助MDX中的用户定义函数,如StrToTuple函数。由于用户定义函数不能处理MDX对象引用,用户定义函数可以返回MDX格式的字符串返回值来表示元组,并使用StrToTuple函数将它转换为有效的元组引用。5生成MDX中的计算成员5.3高级MDX(9)成员函数计算成员中常常引用成员;成员函数允许计算成员执行复杂成员检索,从而同样轻松地处理层次结构和集合。

MDX中计算成员的解可以是本质上迭代的,因为计算成员可以基于对集合成员的迭代进行构造。MDX中CurrentMember之类的函数使您得以利用此迭代功能5生成MDX中的计算成员5.3高级MDX(10)IIf函数多维表达式(MDX)中的IIf函数可用于执行简单的是或否决策。下例MDX查询示例:WITHMEMBER[Measures].[BigSeller]AS'IIf(Measures.[StoreSales]>20000,"Yes","No")'

SELECT{[Store].[StoreName].Members}ONCOLUMNS,{[Measures].[StoreSales],[Measures].[BigSeller]}ONROWSFROMSales

本MDX示例返回两行。一行是[Measures].[StoreSales]成员,提供各个商店的总销售额。第二行是一个计算成员,它基于各个商店的销售额决定商店是否是个"大销售商"。5生成MDX中的计算成员5.3高级MDXMDX常用多维数据集切片装载到内存,对其进行高速缓存以达到更快检索的目的。(1)可使用CREATECACHE语句。(2)WITH语句也可完成这项任务。例如,下面的MDX查询使用WITH语句来进行高速缓存:WITHCACHEAS'(Store.[StoreName].Members)'

SELECT{[Store].[StoreName].Members}ONCOLUMNS,{[Measures].[UnitSales]}ONROWSFROMSales5生成MDX中的高速缓存5.4高级MDX使用WITH创建高速缓存[WITH<formula_specification>][,<formula_specification>]SELECT[<axis_specification>[,<axis_specification>...]]FROM[<cube_specification>][WHERE[<slicer_specification>]]高速缓存的<formula_specification>值进一步分解:<formula_specification>::=CACHEAS'(<set>[,<set>...])'(1)<set>值是用来创建高速缓存的集合表达式。<set>值可支持MDX集合函数的使用。(2)当用<set>集合表达式构造高速缓存时,下列规则适用:(a)每个<set>都必须包含仅来自一个维度的成员。各个成员必须互不相同。(b)各个<set>必须来自不同的维度。(c)<set>不能包含度量值。5生成MDX中的高速缓存5.4高级MDX计算单元功能通过使您得以定义单元的特定切片(称为计算子多维数据集),并将公式应用到该计算子多维数据集内的各个单元来提供此功能。应用公式时,依据的是可应用于每个单元的可选条件。计算成员是维度成员,其值于运行时通过在定义计算成员时所指定的表达式计算而得到。(1)使用CREATECELLCALCULATION语句。对于现有多维数据集,ALTERCUBE语句也可用来添加计算单元。(2)若要创建用于会话生存周期的计算单元,请使用CREATECELLCALCULATION语句。(3)若要创建用于查询生存周期的计算单元,请使用WITH语句5生成MDX中的计算单元5.5高级MDX使用WITH创建计算单元[WITH<formula_specification>][,<formula_specification>]SELECT[<axis_specification>[,<axis_specification>...]]FROM[<cube_specification>][WHERE[<slicer_specification>]]<formula_specification>::=CELLCALCULATION<formula_name>FOR'(<calculation_subcube>)'AS'<calculation_formula>'[,<calculation_property_list>]<cell_property_list>::=<property_name='<value>’[,<property_name>='<value>'...]<formula_name>值是计算单元的名称。<calculation_subcube>包含一列正交的、单维度MDX集合表达式,而每个表达式都必须解析为下列集合分类之一:5生成MDX中的计算单元5.5高级MDX空集合:解析为空集合的MDX集合表达式。在这种情况下,该集合被忽略。单个成员集合:解析为单个成员的MDX集合表达式。级别成员的集合:解析为单个级别的成员的MDX集合表达式。其示例为<<Level>>.MembersMDX函数。若要包括计算成员,请使用<<Level>>.AllMembersMDX函数。后代的集合:解析为指定成员后代的MDX集合表达式。其示例为Descendants(<<Member>>,<<Level>>,<<Desc_flags>>)MDX函数。5生成MDX中的计算单元5.5高级MDX1.在MDX中使用用户定义函数:无参数调用:MyNewFunction()有参数调用:MyNewFunctionWithParms("Parameter1",2,800)5在MDX中创建和使用用户定义函数5.6高级MDX2.USELIBRARY语句:

用USELIBRARY语句执行外部库的装载。用户定义函数都必须与COM类相关联,这些类通常以MicrosoftActiveX动态链接库(DLL)的形式提供。假如用户定义函数位于C:\Winnt\System、名为MyFunc.dll的ActiveXDLL的一部分,可将其装载如下:USELIBRARY"C:\WINNT\SYSTEM\MyFunc.dll"与"MyFuncClass"类关联,可装载库:USELIBRARY"MyFunc.MyFuncClass"

当引用可能位于不同服务器的不同位置的库时,推荐使用本方法。多个库可以用单个USELIBRARY语句同时装载:USELIBRARY"C:\WINNT\SYSTEM\MyFunc.dll","C:\WINNT\SYSTEM\NewFuncs.dll"不带参数的USELIBRARY语句将注消所有函数库。5在MDX中创建和使用用户定义函数5.6高级MDX3.DROPLIBRARY语句DROPLIBRARY语句可用于卸载特定库或卸载所有的库:DROPLIBRARY"MyFunc.MyFuncClass"PivotTable服务支持DROPLIBRARY语句。5在MDX中创建和使用用户定义函数5.6高级MDX4.创建用户定义函数用户定义函数可用支持COM接口的任何编程语言创建用户定义函数可接受任何可强制转换为字符串、数字或者字符串数组或数字数组的参数。用户定义类型或对象引用不能用作参数。数组也可用作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论