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

先看这一个查询 -

SELECT { [Measures].[Reseller Order Count] } ON 0,
NON EMPTY {[Promotion].[Promotion].MEMBERS }
DIMENSION PROPERTIES [Promotion].[Promotion].[Discount Percent]
ON 1
FROM [Adventure Works]

上面的查询返回了12个 Promotion 成员,DIMNSION PROPERTIES 关键字用来获取有关成员的属性信息 - Discount Percent。

可以双击成员查看它们的属性信息,例如双击 No Discount 成员可以看到它的成员属性 -

下面我们要做的就是排除掉  [Promotion].[Promotion].[Discount Percent]  成员属性值为0,2 和 5 的成员。

添加 WHERE 条件

SELECT { [Measures].[Reseller Order Count] } ON 0,
NON EMPTY {[Promotion].[Promotion].MEMBERS }
DIMENSION PROPERTIES [Promotion].[Promotion].[Discount Percent]
ON 1
FROM [Adventure Works]
WHERE ( -
{
[Promotion].[Discount Percent].&[],
[Promotion].[Discount Percent].&[2.E-2],
[Promotion].[Discount Percent].&[5.E-2]
}
)

打开 Promotion 维度找到 Discount Percent 然后将 0,2,5 三个值拖放过来,最后用 - 号表示要排除

最终 'No Discount', 'Volume Discount 11 to 14', 'Volumn Discount 15 to 24' 这几个成员就被排除掉了。

在最开始的查询中并没有使用任何的切片 Slicer 去过滤层次结构轴上的任何成员,但是也不需要显示的写出来,因为 SSAS 有一套元组的自动填充规则来将局部元组补充完全。通过 WHERE 条件我们使用到了切片的概念,它实则就是在层次结构轴上排除掉了'No Discount', 'Volumn Discount 11 to 14', 'Volumn Discount 15 to 24' 这几个成员,那么整个 Cube 空间的形成自然也将排除掉由这几个成员与其它层次结构轴构成的轴空间。

我们也可以使用 Except 函数来实现同样的结果:

SELECT { [Measures].[Reseller Order Count] } ON 0,
NON EMPTY {[Promotion].[Promotion].MEMBERS }
DIMENSION PROPERTIES [Promotion].[Promotion].[Discount Percent]
ON 1
FROM [Adventure Works]
WHERE EXCEPT(
{[Promotion].[Discount Percent].[Discount Percent].MEMBERS},
{
[Promotion].[Discount Percent].&[],
[Promotion].[Discount Percent].&[2.E-2],
[Promotion].[Discount Percent].&[5.E-2]
}
)

EXCEPT ({SET 1},{SET 2}) 函数的作用就是取得 SET 1 没有在 SET 2 中出现的那部分成员形成的集合,注意返回的是 SET 1 中的成员。

在这个例子中,Discount Percent 属性中定义了 MemberValue 值,因此还可以通过 Filter 函数来实现 NOT IN 的逻辑。

SELECT { [Measures].[Reseller Order Count] } ON 0,
NON EMPTY {[Promotion].[Promotion].MEMBERS }
DIMENSION PROPERTIES [Promotion].[Promotion].[Discount Percent] ON 1
FROM [Adventure Works]
WHERE
(
{ FILTER(
[Promotion].[Discount Percent].[Discount Percent].MEMBERS,
[Promotion].[Discount Percent].CurrentMember.MemberValue >= 0.1
)
}
)

但是要注意,这里在 FILTER 中的条件表达式的前提是 [Promotion].[Discount Percent].CurrentMember.MemberValue 中的值确实是连续的,如果不是连续的已经排过序的值,那么就不可以使用 Filter 来实现这个例子。

其它 BI 系列文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

MDX Cookbook 04 - 在集合中实现 NOT IN 逻辑 (Minus, Except, Filter 等符号和函数的使用)的更多相关文章

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

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

  2. MDX Cookbook 01 - Skipping Axis 合理使用空的 SET 集合获取全部层次结构成员

    假设我们只想显示一些与数据没有任何关联的维度成员信息,并且希望它们能够以行集的形式来显示,那么在 MDX 中就应该直接显示 ROWS  AXIS (1) 并且忽略掉 COLUMNS AXIS(0).比 ...

  3. List集合中元素排序

    应用场景: 在开发中经常遇到要对List<Object>集合进行排序,并且是根据集合中的对象的某个属性来进行排序    --------以下就此做出的解决方案 public static ...

  4. MDX Cookbook 06 - GENERATE 循环遍历

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

  5. Java分享笔记:使用keySet方法获取Map集合中的元素

    /*--------------------------- Map集合中利用keySet方法获取所有的元素值: ....keySet方法:将Map中的所有key值存入到Set集合中, ....利用Se ...

  6. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

    在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...

  7. 判断IEnumerable<T>集合中是否包含有T对象

    比如,有角色集合中,只有用户创建有角色,才出现“分配”铵钮.反之,隐藏. IEnumerable有一个方法,叫Any:

  8. java范型集合中的成员排序

    范型集合中的类是JsonObject,不是自定义类,如果是自定义类就直接取要比较的字段值. ArrayList<JSONObject> TList = new ArrayList<J ...

  9. POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)

    实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...

随机推荐

  1. jquery的clone方法应用于textarea和select的bug修复不能copy值,clone id重复的解决

    textarea和select的值clone的时候会丢掉,在clone的时候将val再重新赋值一下,如果知道这个了就简单了, 测试发现,textarea和select的jquery的clone方法有问 ...

  2. MySQL运行内存不足时应采取的措施

    导读 排除故障指南:MySQL运行内存不足时应采取的措施? 原文出处:<What To Do When MySQL Runs Out of Memory: Troubleshooting Gui ...

  3. day14--前端HTML、CSS

        HTML是一个裸体的人,CSS穿上华丽的衣服,JS动起来.     HTML 1. -一套规则,浏览器识别的规则 2. 开发者: 学习HTML规则 开发后台程序 - 写HTML文件(充当模板的 ...

  4. python全栈开发知识点补充for else和while else如果不是除正常以外的其他方式退出循环,那么else语句就会被执行。

    如果不是除正常以外的其他方式退出循环,那么else语句就会被执行. 也就是循环体内没有break语句.return语句.和其他异常语句的执行. for   else >>> for ...

  5. Python yaml模块

    引用自:https://www.cnblogs.com/shaosks/p/7344771.html 一.简介 YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写.它实质上是一种通 ...

  6. 063 日志分析(pv  uv  登录人数  游客人数  平均访问时间  二跳率  独立IP)

    1.需求分析 分析指标 pv uv 登录人数 游客人数 平均访问时间 二跳率 独立IP 2.使用的日志(一号店),会话信息 3.创建数据库 4.创建源表,存储源数据 5.创建我们需要的use表 6.创 ...

  7. 缓存击穿、缓存失效及热点key的解决方案

    分布式缓存是网站服务端经常用到的一种技术,在读多写少的业务场景中,通过使用缓存可以有效地支撑高并发的访问量,对后端的数据库等数据源做到很好地保护.现在市面上有很多分布式缓存,比如Redis.Memca ...

  8. Pyinstaller打包附带DLL、图标和压缩EXE方法

    Pyinstaller打包附带DLL.图标和压缩EXE方法     转载: https://blog.csdn.net/xinyingzai/article/details/80282856   目的 ...

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

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

  10. 聊聊ReentrantLock的内部实现

    大家都用过ReentrantLock,但是大家对内部实现是否足够了解呢,下面我就简单说一下其中的实现原理. ReentrantLock是可重入锁,也就是同一个线程可以多次获取锁,每获取一次就会进行一次 ...