一个完整的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