假设我们只想显示一些与数据没有任何关联的维度成员信息,并且希望它们能够以行集的形式来显示,那么在 MDX 中就应该直接显示 ROWS  AXIS (1) 并且忽略掉 COLUMNS AXIS(0)。比如说有100个成员信息,如果是一列100行的形式通常符合大家的查询习惯,如果是一行100列,读起来就比较困难。

需要了解的是 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 知识点:

  1. MEMBERS - 从属性层次结构或者属性层次结构某一层中取出所有的成员,返回的是一个成员的集合 {SET}。如果某一个 Hierarchy 层次结构没有指定特别的 Level 时,Members 函数就会返回包含 All 在内的所有成员。关于 MEMBERS 的有关内容可以参照: MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)
  2. Filter - 对指定集合中的每个元组计算指定一个逻辑表达式,如果表达式计算结果为 True,那么该函数将返回由指定集中每个元组构成的集。如果所有元组的计算结果都不为 True,则返回一个空集。关于 Filter 函数的使用可以参照 : MDX Step by Step 读书笔记(六) - Building Complex Sets (复杂集合的处理) -  Filtering Sets
  3. InStr - 返回一个字符串在另一个字符串中第一次出现的位置。有关 InStr 的内容可以参照 MSDN InStr 函数

其它 BI 笔记请参照 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

MDX Cookbook 01 - Skipping Axis 合理使用空的 SET 集合获取全部层次结构成员的更多相关文章

  1. MDX Cookbook 06 - GENERATE 循环遍历

    有时候需要从集合中取出特定的成员但是又不能执行遍历操作,这个时候就可以使用 GENERATE 函数来解决这个问题. 根据地区查询每年的销售额 - SELECT NON EMPTY { , NON EM ...

  2. 返回空的list集合*彻底删除删除集合*只是清空集合

    ---------- 要求返回空的List集合----------- List<String> allList = Collections.emptyList();// 返回空的List集 ...

  3. MDX Cookbook 12 - 计算 SMA 简单移动平均 LastPeriods() 函数的使用

    先认识一下这几个名词 Moving Average (MA) 移动平均,或者叫做移动平均线,是技术分析中一种分析时间序列数据的工具.最常见的就是利用股价,回报或交易量等变数计算出移动平均.可以利用移动 ...

  4. MDX Cookbook 11 - 计算 Year Over Year 增长 (同比计算) ParallelPeriod

    这一小节主要介绍如何在一个平行期间的度量值,当前值的对比对象是指当前值的上一年,上一个季度或者其它时间级别上与当前值同一时间点上的的那个对象.有一个非常常见的需求就是对比上一年同一个时间点的某个值来判 ...

  5. MDX Cookbook 10 - 计算 Year To Date 的 Running Total(YTD 与 PeriodsToDate 的区别)

    在这个小节中我们将计算度量值的 Year To Date 的值,也就是计算从年开始到当前时间成员为止的度量值的累加结果. 下面的这个查询显示了所有以周为单位的 Reseller Sales Amoun ...

  6. MDX Cookbook 08 - 基于集合上的迭代递归

    递归的应用有时是非常重要的,特别在迭代一个集合的时候.为什么这么说呢?原因在于迭代在MDX中的使用是基于集合函数的,像 GENERATE() 它们都需要遍历整个集合.但是如果这个集合非常的庞大,我们仅 ...

  7. MDX Cookbook 07 - 在不同层次结构的成员中实现 逻辑 OR 的效果

    第一个示例:查看所有包括黑色产品的子目录产品中的 Reseller Order Quantity 和 Reseller Order Count. 第二个示例:和第一个示例查询结构一样,只是筛选的是大小 ...

  8. MDX Cookbook 05 - 条件过滤 FILTER-COUNT 与 SUM-IIF 实现

    下面的这个查询返回每个财月的 Customer Count 和 基于上个月比较的 Growth in Customer Base 的记录,Slicer 是 Mountain bikes. SELECT ...

  9. MDX Cookbook 04 - 在集合中实现 NOT IN 逻辑 (Minus, Except, Filter 等符号和函数的使用)

    有时需要从一些查询结果里排除掉一些成员,当然平常情况下可以通过 MDX 查询中的 WHERE 条件即 Slicer 切片来完成,同样的这里显示的是如何在切片中排除掉一些成员. 先看这一个查询 - , ...

随机推荐

  1. SPLAY,LCT学习笔记(三)

    前两篇讲述了SPLAY模板操作,这一篇稍微介绍一下SPLAY的实际应用 (其实只有一道题,因为本蒟蒻就写了这一个) 例:bzoj 1014火星人prefix 由于本蒟蒻不会后缀数组,所以题目中给的提示 ...

  2. python创建__init.py__文件导入模块仍然报错ModuleNotFoundError: No module named 'name'

    今自定义模块后非相同目录导出提示找不到模块报错信息如下: ModuleNotFoundError: No module named 'name' 各方查找各位大神方法很多 参考链接 1.在需要导入的文 ...

  3. java 泛型 ? 和 T的区别

    看了一个CSDN的问题,感觉就清楚了:http://bbs.csdn.net/topics/300181589/ 摘录其中的重点: 泛型方法: public <T extends Object& ...

  4. (canvas)两小球碰撞后的速度问题研究

    这两天在研究canvas碰撞 先把小球开始运动的图拿出来 参考了一下别的的代码,在两个小球碰撞处理上,我觉得不完善 怎么样处理才算完善呢,当然是要用高中物理学的动量守恒了和机械能守恒了 机械能守恒我其 ...

  5. Codeforces Round #228 (Div. 1)

    今天学长给我们挂了一套Div.1的题,难受,好难啊. Problem A: 题目大意:给你n个数字,让你叠成n堆,每个数字上面的数的个数不能超过这个数,如 3 上面最多放三个数字 问你,最少能放几堆. ...

  6. 《Gradle权威指南》--Gradle构建脚本基础

    No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ...

  7. Visual Studio Code-GO tasks 设置 (实现在vsc下直接编译输出的功能)

    Visual Studio Code -GO 使用过程中发现,如果要编译输出某个文件需要去cmd窗口才行,感觉特别麻烦网上一直没找到解决办法,这几天查看Visual Studio Code文档发现它提 ...

  8. C#全能数据库操作类及调用示例

    C#全能数据库操作类及调用示例 using System; using System.Data; using System.Data.Common; using System.Configuratio ...

  9. bzoj3545: [ONTAK2010]Peaks 重构树 主席树

    题目链接 bzoj3545: [ONTAK2010]Peaks 题解 套路重构树上主席树 代码 #include<cstdio> #include<algorithm> #de ...

  10. 洛谷.4015.运输问题(SPFA费用流)

    题目链接 嗯..水题 洛谷这网络流二十四题的难度评价真神奇.. #include <queue> #include <cstdio> #include <cctype&g ...