• 简单的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

  • 相关阅读:
    PHP-FPM doesn't write to error log
    CSS中position属性( absolute | relative | static | fixed )详解
    微信分享踩坑
    使用layer-list实现特殊的效果
    如何正确的给ViewGroup设置OnClickListener
    android:clipchildren属性
    学习有边界吗?学了几年感觉什么也做不出,学习无用?
    电动车的蓄电池与锂电池
    《增长黑客》节选与笔记
    Firefox火狐浏览器的高效使用
  • 原文地址:https://www.cnblogs.com/shikyoh/p/2231461.html
Copyright © 2020-2023  润新知