简单的MDX案例及说明(2)

一个完整的MDX查询

例一:一个简单的MDX语句

显示代码打印
1 SELECT 

2 NON EMPTY {  

3     [Product].[Product Category - Product Class].[产品目录]  

4 } ON COLUMNS,  

5 NON EMPTY {  

6     [Store].[Sales Country - Sales Region - Sales District Id - Region].[地区]  

7 } ON ROWS 

8 FROM [Foodmart多维数据立方]  

9 WHERE [Time By Day].[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].[Product Category – Product Class].[产品目录]表示了访问的元组,这个元组的含义是:Product维度的名为Product Category – Product Class的层次下的名为“产品目录”这个等级所包含的所有成员。[Product]是维度名称,[Product Category – Product Class]是层次名称,[产品目录]是等级名称。最外面的大括号表示集合,即所有[Product].[Product Category – Product Class].[产品目录]元组所组成的集合。由此可以看出MDX中轴的访问顺序是:维度à层次à等级à成员。NON EMPTY的作用是过滤空值结果。查询结果如图七。

      ROWS轴的结构与COLUMNS相同,所有128个轴的基本访问规则都是一样。每个轴之间用逗号分隔。另外,在同一个轴中不能出现不同维度的元组。如下:
 
例二:错误的MDX(一个轴中包含两个维度的元组)
显示代码打印
01 SELECT 

02 {  

03     [Product].[Product Category - Product Class].[产品目录],   

04     [Store].[Store Name].[Store Name]  

05 } ON COLUMNS,  

06 {  

07     [Store].[Sales Country - Sales Region - Sales District Id - Region].[地区]  

08 } ON ROWS 

09 FROM [Foodmart多维数据立方]  

10 WHERE [Time By Day].[month_of_year].&[3]
 

图八:错误信息

例二是一个错误的MDX查询,因为在COLUMNS轴中出现了两个维度的元组,这样的查询在SSAS中会执行的时候会报“函数中指定的两个集具有不同的维数。”这样的异常信息(如图八)。可以这样理解这种错误:多维数据集就像是一个个的正方体,正方体的每一条边都是一个维度,每一条边也都只能表示一个维度,如果让一条边表示两个维度自然就会出错,这也是不符合逻辑的。

如果要将不同维度的元组集合放到同一个轴中就要使用叉积,即不同维度之间的笛卡尔积。叉积的使用有几种不同的写法,可以使用CROSSJOIN函数、可以将集合与集合用*号相乘,不过最简单的就是直接把同一个轴中的不同维度用小括号括起来。可以把例二修改一下:

例三:修改后的例二,通过叉积使得可以在一个轴中观察不同维度的数据

显示代码打印
01 SELECT 

02 NON EMPTY {  

03     (  

04         [Product].[Product Category - Product Class].[产品目录],     

05         [Store].[Store Name].[Store Name]  

06     )  

07 } ON COLUMNS,  

08 NON EMPTY {  

09     [Store].[Sales Country - Sales Region - Sales District Id - Region].[地区]  

10 } ON ROWS 

11 FROM [Foodmart多维数据立方]  

12 WHERE [Time By Day].[month_of_year].&[3]


图九:叉积查询结果
 

例三就可以正常的运行而不会出现例二的错误了,不同之处仅仅是为两个不同的维度加了个小括号。加了小括号后元组的结构就发生了变化,不再是只由Product维度构成,而是由Product和Store两个维度共同构成。小括号中可以包含多个维度或者是同一维度不同层次的元组,但是不能有相同维度的员一层次存在。如果存在某两个相同维度的同一层次,在执行MDX的时候会报“…层次结构在CROSSJOIN函数中使用了多次”这样的异常信息。

文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/4_webprogram/asp.net/asp_netshl/20100722/485021_2.html

原文地址:https://www.cnblogs.com/shikyoh/p/2231461.html