MDX用户指南.docx

上传人:b****6 文档编号:6795187 上传时间:2023-01-10 格式:DOCX 页数:61 大小:98.78KB
下载 相关 举报
MDX用户指南.docx_第1页
第1页 / 共61页
MDX用户指南.docx_第2页
第2页 / 共61页
MDX用户指南.docx_第3页
第3页 / 共61页
MDX用户指南.docx_第4页
第4页 / 共61页
MDX用户指南.docx_第5页
第5页 / 共61页
点击查看更多>>
下载资源
资源描述

MDX用户指南.docx

《MDX用户指南.docx》由会员分享,可在线阅读,更多相关《MDX用户指南.docx(61页珍藏版)》请在冰豆网上搜索。

MDX用户指南.docx

MDX用户指南

MDX用户指南

作者

状态

时间

说明

林志贤

创建

2006-3-21

初稿

第1章简介

MDX为MultiDimensionalExpressions的缩写,多维表达式,是标准的OLAP查询语言。

在多数OLAPServer都提供MDX支持,如MicrosoftSQLServerOLAPServices,SAS,HyperionEssbase等。

支持多维对象与数据的定义和操作。

MDX在很多方面与结构化查询语言(SQL)语法相似,但它不是SQL语言的扩展;事实上,MDX所提供的一些功能也可由SQL提供,尽管不是那么有效或直观。

如同SQL查询一样,每个MDX查询都要求有数据请求(SELECT子句)、起始点(FROM子句)和筛选(WHERE子句)。

这些关键字以及其它关键字提供了各种工具,用来从多维数据集析取数据的特定部分。

MDX还提供了可靠的函数集,用来对所检索的数据进行操作,同时还具有用用户定义函数扩展MDX的能力。

MDX为多维数据库提供了表达式查询语法,用于查询Cube数据,并提供了许多强大的分析函数,用于支持常用的OLAP分析。

KingdeeOLAP实现了MDX语法,提供了大多数MDX函数,部分函数未实现,因为我们认为当前没有必要实现。

本文档后面会提供支持的函数列表。

本指南更像一本入门教程。

更为详细的信息可以参考SQLServerOLAPServices联机文档。

第2章基本概念

2.1Cube结构

在介绍MDX之前,我们简单介绍一下cube结构,理解cube结构是学习MDX的前提。

我们采用SQLServerOLAPServices自带的事例OLAP数据库FoodMart来描述。

我们建议你阅读《Olap模型设计指南》来学习、熟悉Cube结构。

Cube是联机分析的关键。

它们是一种多维结构,包括原始事实数据、聚合数据,这些数据聚合允许用户快速进行复杂查询。

Cube包含两个基本的概念:

维度和度量。

维度(Dimension):

维度提供了分类描述,表示一类分析角度,用户通过维度来分析度量数据。

度量(Measures):

度量表示用来聚合分析的数字信息,如数量,销售金额等。

重要:

度量的集合组成了一个特殊的维度,叫做”Measures”。

一个维度可以包含级别的层级结构,级别(Level)表示特定的分类.比如,地区维度可以包含级别层级:

Country、State、City。

每个级别比它的父级别在数据粒度上更加细粒度。

又比如:

一个时间维可能包含级别:

年、季、月。

成员,是最重要的概念之一。

一个成员是维度(包括度量维Measures)上的一个项目值,时间维度上“年”级别的成员可能有2000、2001,月成员有1、2、3等等。

计算成员是一种运行时通过特殊表达式动态计算的成员。

计算成员可以定义为度量。

计算成员不影响现有的cube数据,它基于cube数据,通过各种数学表达式和各种函数定义,可以创建复杂的表达式。

任何动态分析功能,都可以通过计算成员实现,比如实现占比、同期比等等。

2.2示例Cube数据库

示例OLAP数据库结构(FoodMartSalesCube,来自MicrosoftOLAPServices)。

维度

维度名

级别

描述

Customers

Country

State

City

Name

顾客的地理分布层级

EducationLevel

EdicationLevel

顾客教育水平,一个级别,扁平结构

Gender

Gender

顾客性别

MaritalStatus

MaritalStatus

顾客婚姻状况

Product

ProductFamily

ProductDepartment

ProductCategory

ProductSubCategory

Brandname

ProductName

产品维,6个级别

PromotionMedia

MediaType

促销媒体

Store

StoreCountry

StoreSate

StoreCity

StoeName

商店的地理分布层级

StoeSizeinSQFT

StoreSquareFeet

商店面积

StoreType

StoreType

商店类型

Time

Years

Quarters

Months

时间维

YearlyIncome

YearlyIncome

顾客年收入

度量

度量名

描述

UnitSales

Numberofunitssold

StoreCost

Costofgoodssold

StoreSales

Valueofsalestransactions

SalesCount

Numberofsalestransactions

StoreSalesNet

Valueofsalestransactionslesscostofgoodssold

SalesAverage

Storesales/salescount

2.3表达式表示法

维度、级别、成员等,一般用唯一名称UniqueName来标示,可以用[]包围name,如果name有空格或者以数字开头,必须使用[],否则可以忽略。

UniqueName是根据层级结构表示的一种方法。

即递归显示出祖先的名称。

维度(Dimension):

维度直接用[]包围。

Product的唯一名称为[Product]或Product,维度EducationLevel的唯一名称为[EducationLevel]。

度量维为[Measures]。

级别(Level):

级别的UniqueName为[维度名称].[级别名称],如[Product].[ProductFamily],同样,如果没有空格,[]可以省略,如Product.[ProductFamily]。

成员(Member):

成员的UniqueName格式为[维度].(ParentMemberUniqueName).[MemberName],如上面时间维上的2003年2月份的UniqueName为[Time].[1].[2],中间的1为1季度,因为该维度的结构为年、季、月。

度量(Measure):

度量实际上是属于度量维的成员。

如度量UnitSales的UniqueName为[Measures].[UnitSales]。

UniqueName是OLAP元素内部的表示法,在MDX查询语言中,可以使用UniqueName来表示元素。

同时,MDX还提供模糊和其它等价的元素标示方式。

表现在:

1)省略维度名标示级别,如果一个维度的级别名称在整个Cube中是唯一的,那么可以省略维度名来查询级别。

如Product.[ProductFamily]可以写成[ProductFamily]。

2)省略维度名标示成员,如果省略维度名,可以标示该维度最高级别的成员,如[Time].[2000]可以写成[2000],[Measures].[UnitSales]可以写成[UnitSales]。

3)成员挂在级别下,即成员不一定要写成[维度].(ParentMemberUniqueName).[MemberName],可以写成[维度].[级别].[MemberName].如2000年3月可以写成[Time].[Months].[3]。

模糊查询表示法,都基于不会重复的假设,如果有重复的元素,取第一个查找到的元素作为查询结果,可能发生错误。

因此,建议使用完备的表示法。

2.4元组、集合

元组用于定义来自多维数据集的数据切片;它由来自一个或多个维度的单个成员的有序集合组成。

元组内不能包含来自同一个维度的多个成员。

元组用()包围。

如:

(时间.[下半年])

(时间.[下半年],[产品].[手机].[Nokia])

如果一个元组是由单个维度的成员组成,那么可以不用()包围,即(时间.[下半年])可表示成:

时间.[下半年]。

集合是零个、一个或多个元组的有序集合。

集合最常用于在MDX查询中定义轴维度和切片器维度,并且同样可能只具有单个元组或可能在某些情况下为空。

在MDX语法中,元组用花括号括起来以构造集合,下面的示例显示具有两个元组的集合:

{(时间.[上半年],路线.非陆地.航空),(时间.[下半年],路线.非陆地.海路)}

一个集合可包含同一个元组不止一次的出现。

下面的集合是可接受的:

{时间.[下半年],时间.[下半年]}

集合指以元组表示的一组成员组合,或指集合中的元组所代表的单元中的值,视集合使用的上下文而定。

注意,单个元组的集合不等于元组。

如{时间.[下半年]}不等于时间.[下半年]。

在MDX语法中,很多函数语义中包含元组和集合,作为参数或者返回值。

第3章MDX查询与语义

3.1MDX基本查询

先看看MDX基本语法结构:

基本的MDXSELECT语句包含一个SELECT子句和一个FROM子句,以及一个可选的WHERE子句。

[axisspecificatioin]可以看成是轴的成员选择。

[slicerspecification]表示切片上的成员,可以看成过滤信息,[slicerspecification]可选,如果没有指定,取系统默认的维度成员作为切片。

该查询语句返回一个二维表格数据,可以显示为交叉表形式。

这里Measures表示度量维,[Store]表示Store维,[]可选,如果维度名称有空格,则需要用[]包围。

Members函数施加在维度上返回该维度的所有成员。

该查询显示所有商店的度量值。

二维表格如下:

StoreSales

UnitSales

深圳分店

200000.00

50000

上海分店

300000.00

60000

3.2轴维度和切片器维度

当设计多维表达式(MDX)查询时,应用程序一般查看多维数据集并将维度集合划分为两个子集:

1)轴维度,为多个成员检索数据的维度。

2)切片器维度,为单个成员检索数据的维度。

因为轴维度和切片器维度都可从要查询的多维数据集的多个维度构造,所以用这些术语将要查询的多维数据集使用的维度与在由MDX查询返回的多维数据集中创建的维度区分开。

例如,假定存在名为TestCube的多维数据集,具有两个名为Route和Time的简单维度。

因为多维数据集的度量值是Measures维度的一部分,所以该多维数据集总共有三个维度。

查询要提供一个矩阵,可以在该矩阵内跨路线和时间比较Packages度量值。

在下面的MDX查询示例中,Route和Time维度用作轴维度,Measures维度用作切片器维度。

Members函数表明要用于构造集合的维度或级别的成员,而不必在MDX查询中显式声明给定维度或级别的各个成员。

SELECT

{Route.nonground.Members}ONCOLUMNS,

{Time.[1sthalf].Members}ONROWS

FROMTestCube

WHERE([Measures].[Packages])

得到的值表格类似于下表,表中在COLUMNS和ROWS轴维度的各个交集显示Packages度量值的值。

 

air

sea

1stquarter

60

50

2ndquarter

45

45

MDX首先评估轴维度和切片器维度,并在从要查询的多维数据集检索信息之前生成结果多维数据集的结构。

3.2.1指定轴维度的内容

轴维度决定多维结果集的边缘。

多维表达式(MDX)使用SELECT子句通过将集合指派到特定轴来指定轴维度。

以下信息描述在MDX中怎样处理这种指派。

在下面的语法示例中,每个值定义一个轴维度。

数据集中轴的个数等于多维表达式(MDX)查询中值的个数。

MDX查询最多可以支持128个指定轴,但几乎没有MDX查询会用到5个以上的轴。

语法可分解为:

:

:

=ON

:

:

=COLUMNS|ROWS

轴维度上的只能接受集合,如果是手工指定成员集合,必须用{}包围,如果使用MDX集合函数,则不需要用{}包围,因为集合函数返回值为集合。

一个轴维度上可以包含几个维度,如:

SELECT{[Measures].[Sales_Dollars],[Measures].[Sales_Units],[Measures].[Sales_Units_max]}ONcolumns,CrossJoin({[State].[Canada],[State].[Mexico],[State].[USA]},{[Product].[Bread],[Product].[Dairy],[Product].[Meat]})ONrowsFROMsalesWHERE([Time].[AllTime],[Employee].[AllEmployee])

Columns轴上是手工指定的成员元组集合,用{}包围,Rows轴使用集合函数CrossJoin,该函数返回两个集合的交集,Rows轴上包含两个维度State和Product。

3.2.2片器维度的内容

切片器维度筛选多维数据。

可以通过将切片器维度包含在多维表达式(MDX)查询的WHERE子句来限制所返回的数据。

假定未显式指派给轴的维度是切片器维度,并用其默认成员进行筛选。

则默认成员为最高级别的第一个成员。

切片器维度还可通过使用MDX语法的WHERE子句进行显式指定。

WHERE子句的语法可分解为:

[WHERE[]]

切片器维度只可接受评估为单个元组的表达式。

如下例所示:

WHERE([Time].[1sthalf],[Route].[nonground])

3.3高级查询-使用计算成员

基本MDX查询提供了对多维数据的简单查询,MDX查询还提供了更为丰富强大的多维查询工具。

计算成员允许在查询表达式中定义公式,并将该公式当成一个新的成员,挂在某个维度下。

它并非通过检索数据来解析,而是通过计算MDX表达式来返回值。

在MDX查询中构造和使用计算成员的能力为多维数据提供了大量操作功能。

多数分析功能都可以通过计算成员来实现。

MDX通过With语句来创建计算成员,下面的语法用于将WITH关键字添加到MDXSELECT语句:

[WITH]

[,]

SELECT[

[,...]]

FROM[]

[WHERE[]]

计算成员的值在以下语法定义中进一步分解:

:

:

=MEMBER

AS''

[,Format_String=]

[,=...]

值是计算成员的完全合法名称,其中包括了该计算成员所关联的维度或级别,而值在经过计算后,将返回计算成员的值。

通过在Format_String中指定计算成员的格式化串,跟Cube定义中的Measure定义的formatString一样,采用java.text.DecimalFormater中的格式化语法。

例如,下面的MDX查询示例定义了两个计算成员。

第一个计算成员[Measures].[StoreType]用于表示StoreType成员属性。

第二个计算成员[Measures].[ProfitPct]用于计算给定商店的总利润率,并将其表示为格式化的百分比值。

WITH

MEMBER[Measures].[StoreType]AS

'[Store].CurrentMember.Properties("StoreType")',

SOLVE_ORDER=2

MEMBER[Measures].[ProfitPct]AS

'(Measures.[StoreSales]-Measures.[StoreCost])/Measures.[StoreSales]),

FORMAT_STRING='#.00%'

SELECT

{[Store].[StoreName].Members}ONCOLUMNS,

{[Measures].[StoreSales],[Measures].[StoreCost],[Measures].[StoreType],

[Measures].[ProfitPct]}ONROWS

FROMSales

计算成员可在层次结构的任意位置创建。

例如,下列MDX查询示例定义作为[BeerandWine]成员的子成员创建的计算成员,以确定给定商店的啤酒和果酒(BeerandWine)的单位销售额是否至少为100.00:

WITH

MEMBER[Product].[BeerandWine].[BigSeller]AS

'IIf([Product].[BeerandWine]>100,"Yes","No")'

SELECT

{[Product].[BigSeller]}ONCOLUMNS,

{Store.[StoreName].Members}ONROWS

FROMSales

也可创建不仅取决于多维数据集中的现有成员,而且取决于同一MDX表达式中定义的其它计算成员的计算成员。

下列示例说明这样的MDX表达式:

WITH

MEMBER[Measures].[ProfitPct]AS

'Val((Measures.[StoreSales]-Measures.[StoreCost])/Measures.[StoreSales])',

FORMAT_STRING='#.00%'

MEMBER[Measures].[ProfitValue]AS

'[Measures].[StoreSales]*[Measures].[ProfitPct]',

FORMAT_STRING='#,###.##'

SELECT

{[Store].[StoreName].Members}ONCOLUMNS,

{[Measures].[StoreSales],[Measures].[StoreCost],[Measures].[ProfitValue],

[Measures].[ProfitPct]}ONROWS

FROMSales

第二个计算成员[Measures].[ProfitValue]使用第一个计算成员[Measures].[ProfitPct]中创建的值来生成自己的值。

只能是后面的计算成员使用前面的计算成员,不能反过来,所有,计算成员的顺序很重要。

3.4高级查询-使用命名集合

命名集合是一个与别名相关联的集合表达式。

它定义一个集合,可以在MDX语句中多出使用,主要是为了方便维护,提高可读性,如果该集合被多处使用,可以重用,减少解析时间,提高性能。

命名集别名视为集合表达式,并可用于任何接受集合表达式的地方。

下面的语法用于将WITH关键字添加到MDXSELECT语句:

[WITH]

[,]

SELECT[

[,...]]

FROM[]

[WHERE[]]

命名集的值进一步分解为以下语法定义:

:

:

=SETAS''

参数包含命名集的别名。

参数包含命名集别名所指的集合表达式。

例如,[ChardonnayChablis]命名集用于Product维度上的所有Chardonnay酒和Chablis酒成员。

以下示例对命名集的语法进行了描述:

WITHSET[ChardonnayChablis]AS

'{[Product].[AllProducts].[Drink].[AlcoholicBeverages].[BeerandWine].[Wine].[Good].[GoodChardonnay],

[Product].[AllProducts].[Drink].[AlcoholicBeverages].[BeerandWine].[Wine].[Pearl].[PearlChardonnay],

[Product].[AllProducts].[Drink].[AlcoholicBeverages].[BeerandWine].[Wine].[Portsmouth].[PortsmouthChardonnay],

[Product].[AllProducts].[Drink].[AlcoholicBeverages].[BeerandWine].[Wine].[TopMeasure].[TopMeasureChardonnay],

[Product].[AllProducts].[Drink].[AlcoholicBeverages].[BeerandWine].[Wine].[Walrus].[WalrusChardonnay],

[Product].[AllProducts].[Drink].[AlcoholicBeverages].[BeerandWine].[Wine].[Good].[GoodChablisWine],

[Product].[AllProducts].[Drink].[AlcoholicBeverages].[BeerandWine].[Wine].[Pearl].[PearlChablisWine],

[Product].[AllProducts].[Drink].[AlcoholicBeverag

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1