MDX Cookbook 01 - Skipping Axis 合理使用空的 SET 集合获取全部层次结构成员
2013-10-23 21:26
405 查看
假设我们只想显示一些与数据没有任何关联的维度成员信息,并且希望它们能够以行集的形式来显示,那么在 MDX 中就应该直接显示 ROWS AXIS (1) 并且忽略掉 COLUMNS AXIS(0)。比如说有100个成员信息,如果是一列100行的形式通常符合大家的查询习惯,如果是一行100列,读起来就比较困难。
需要了解的是 SELECT 语句最多可以支持 128 个轴,轴的序号从 0 ~ 127,但是基本上我们不会使用的到那么多, 一般只使用前两个, 即我们常用的 COLUMNS 和 ROWS, 因为大多数客户端工具只能支持到二维即显示行和列。并且是使用这些轴的名称的时候, 他们的顺序必须是连续的。即如果写了 ROWS, 那么COLUMNS 也必须存在 , 不能只使用 ROWS 而不使用COLUMNS。
那么就只要这样做就可以了,在 COLUMNS 即 0 轴中放置一个空的 SET 集合 { },然后在 ROWS 轴上访问所需要的成员。
如果只需要查询所有包含 "John" 这个字的成员,比如说以后可以做成根据关键字查询 -
如果为了显示 ROWS 轴而在 COLUMNS 轴上加上其它的度量值这样会降低查询效率,因为在 ROWS 中的每一个成员都会到 Cube 空间中去匹配对象的度量值。想这样在 COLUMNS 轴没有度量值的参入,那么 ROWS 轴上的维度成员就直接可以从维度空间里获取,效率更高一些。
如果有一些第三方的工具或者编译器要求必须在 COLUMNS 位置提供度量值数据的话,那么可以使用常量数据来表示 ,这样仍然会比访问 Cube 中的度量值成员效率要高,只不过这个查询的结果并不真正使用而已。
参数化的查询 -
本文涉及到的其它 MDX 知识点:
MEMBERS - 从属性层次结构或者属性层次结构某一层中取出所有的成员,返回的是一个成员的集合 {SET}。如果某一个 Hierarchy 层次结构没有指定特别的 Level 时,Members 函数就会返回包含 All 在内的所有成员。关于 MEMBERS 的有关内容可以参照: MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)
Filter - 对指定集合中的每个元组计算指定一个逻辑表达式,如果表达式计算结果为 True,那么该函数将返回由指定集中每个元组构成的集。如果所有元组的计算结果都不为 True,则返回一个空集。关于 Filter 函数的使用可以参照 : MDX Step by Step 读书笔记(六) - Building Complex Sets (复杂集合的处理) - Filtering Sets
InStr - 返回一个字符串在另一个字符串中第一次出现的位置。有关 InStr 的内容可以参照 MSDN InStr 函数
其它 BI 笔记请参照 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
需要了解的是 SELECT 语句最多可以支持 128 个轴,轴的序号从 0 ~ 127,但是基本上我们不会使用的到那么多, 一般只使用前两个, 即我们常用的 COLUMNS 和 ROWS, 因为大多数客户端工具只能支持到二维即显示行和列。并且是使用这些轴的名称的时候, 他们的顺序必须是连续的。即如果写了 ROWS, 那么COLUMNS 也必须存在 , 不能只使用 ROWS 而不使用COLUMNS。
那么就只要这样做就可以了,在 COLUMNS 即 0 轴中放置一个空的 SET 集合 { },然后在 ROWS 轴上访问所需要的成员。
SELECT { } ON 0, { [Customer].[Customer].[Customer].MEMBERS } ON 1 FROM [Adventure Works]
如果只需要查询所有包含 "John" 这个字的成员,比如说以后可以做成根据关键字查询 -
SELECT { } ON 0, { Filter( [Customer].[Customer].[Customer].MEMBERS, InStr([Customer].[Customer].CurrentMember.Name, 'John') > 0 ) } ON 1 FROM [Adventure Works]
如果为了显示 ROWS 轴而在 COLUMNS 轴上加上其它的度量值这样会降低查询效率,因为在 ROWS 中的每一个成员都会到 Cube 空间中去匹配对象的度量值。想这样在 COLUMNS 轴没有度量值的参入,那么 ROWS 轴上的维度成员就直接可以从维度空间里获取,效率更高一些。
如果有一些第三方的工具或者编译器要求必须在 COLUMNS 位置提供度量值数据的话,那么可以使用常量数据来表示 ,这样仍然会比访问 Cube 中的度量值成员效率要高,只不过这个查询的结果并不真正使用而已。
WITH MEMBER [Measures].[CustomerConstant] AS 1 SELECT { [Measures].[CustomerConstant] } ON 0, { Filter( [Customer].[Customer].[Customer].MEMBERS, InStr([Customer].[Customer].CurrentMember.Name, 'John') > 0 ) } ON 1 FROM [Adventure Works]
参数化的查询 -
SELECT { } ON 0, { Filter( [Customer].[Customer].[Customer].MEMBERS, InStr([Customer].[Customer].CurrentMember.Name, @CustomerName) > 0 ) } ON 1 FROM [Adventure Works]
本文涉及到的其它 MDX 知识点:
MEMBERS - 从属性层次结构或者属性层次结构某一层中取出所有的成员,返回的是一个成员的集合 {SET}。如果某一个 Hierarchy 层次结构没有指定特别的 Level 时,Members 函数就会返回包含 All 在内的所有成员。关于 MEMBERS 的有关内容可以参照: MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)
Filter - 对指定集合中的每个元组计算指定一个逻辑表达式,如果表达式计算结果为 True,那么该函数将返回由指定集中每个元组构成的集。如果所有元组的计算结果都不为 True,则返回一个空集。关于 Filter 函数的使用可以参照 : MDX Step by Step 读书笔记(六) - Building Complex Sets (复杂集合的处理) - Filtering Sets
InStr - 返回一个字符串在另一个字符串中第一次出现的位置。有关 InStr 的内容可以参照 MSDN InStr 函数
其它 BI 笔记请参照 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
相关文章推荐
- MDX Cookbook 07 - 在不同层次结构的成员中实现 逻辑 OR 的效果
- MDX Cookbook 04 - 在集合中实现 NOT IN 逻辑 (Minus, Except, Filter 等符号和函数的使用)
- titanium.cookbook-02-01-使用HTTPClient对象从远程XML读取数据
- MDX Cookbook 12 - 计算 SMA 简单移动平均 LastPeriods() 函数的使用
- MDX Step by Step 读书笔记(四) - Working with Sets (使用集合) - Limiting Set and Auto-Exists
- MDX语句使用随记002--如何在集合中排除某些成员
- MDX Cookbook 08 - 基于集合上的迭代递归
- 福彩双色球中红球由6个1-33之间的数字组合,且不重复,编写代码,使用Set集合来存储随机生成的1-33的数字,然后输出生成的数字
- SQL2008 获取数据库全部表结构
- Web.py Cookbook 简体中文版 - 在webpy中使用Cheetah模板引擎
- kvm虚拟化框架结构层次梳理及图形化的使用
- 使用set集合出来list列表的计算
- 丶使用 typeof 关键字获取类的内部结构
- redis基本结构(4)------集合(set)
- SpringMVC_01 SpringMVC五大组件、SpringMVC编程步骤(不使用注解进行配置)、SpringMVC编程步骤(利用注解进行配置)、参数获取、响应数据
- 通过反射调用的类中使用Spring@Autowired自动装配的成员为空的解决办法不依赖servlet context获取Spring Application Contexts
- 使用树形结构与CTE实现父子列多层次查询
- 集合Set和Map之哈希表和链表结构浅谈
- 使用ps命令获取Linux环境下全部RAC集群进程信息
- 【Java_集合框架Set】HashSet、LinkedHashSet、TreeSet使用区别