MDX Cookbook 05 - 条件过滤 FILTER-COUNT 与 SUM-IIF 实现
下面的这个查询返回每个财月的 Customer Count 和 基于上个月比较的 Growth in Customer Base 的记录,Slicer 是 Mountain bikes。
SELECT {
[Measures].[Customer Count],
[Measures].[Growth in Customer Base]
} ON 0,
NON EMPTY {[Date].[Fiscal].[Month].MEMBERS} ON 1
FROM [Adventure Works]
WHERE
( [Product].[Product Categories].[Subcategory].&[] )
现在来看看如何统计在每个财月中正增长的天数,这是我自己的写法。
WITH
MEMBER [Measures].[Positive number of days]
AS
COUNT(
FILTER(
DESCENDANTS([Date].[Fiscal].CURRENTMEMBER,[Date].[Fiscal].[Date]),
[Measures].[Growth in Customer Base] > 0
)
)
SELECT {
[Measures].[Customer Count],
[Measures].[Growth in Customer Base],
[Measures].[Positive number of days]
} ON 0,
NON EMPTY {[Date].[Fiscal].[Month].MEMBERS} ON 1
FROM [Adventure Works]
WHERE
( [Product].[Product Categories].[Subcategory].&[] )
当然书上的写法更加简洁一些直接在 Filter 的基础之上取得了 COUNT,并且由于天位于叶节点,所以使用 DESCENDANTS 的 Leaves 关键字直接取到叶级别上的月中的每一天,使用的非常灵活。
WITH
MEMBER [Measures].[Positive number of days]
AS
FILTER(
DESCENDANTS([Date].[Fiscal].CurrentMember, , leaves),
[Measures].[Growth in Customer Base] > 0
).COUNT
SELECT {
[Measures].[Customer Count],
[Measures].[Growth in Customer Base],
[Measures].[Positive number of days]
} ON 0,
NON EMPTY {[Date].[Fiscal].[Month].MEMBERS} ON 1
FROM [Adventure Works]
WHERE
( [Product].[Product Categories].[Subcategory].&[] )
Filter 函数实际上是一个迭代函数并且并不是以一个块结构去运行的,因此会降低查询的效率。实际上这个查询可以使用 SUM IF 结构来完成,因此度量值 [Measures].[Growth in Customer Base] 指的就是增长的比率,我们只需要统计增长的天数就可以了。
WITH
MEMBER [Measures].[Positive number of days]
AS
SUM(
Descendants([Date].[Fiscal].CurrentMember, , leaves),
IIF( [Measures].[Growth in Customer Base] > 0, 1, NULL)
)
SELECT {
[Measures].[Customer Count],
[Measures].[Growth in Customer Base],
[Measures].[Positive number of days]
} ON 0,
NON EMPTY {[Date].[Fiscal].[Month].MEMBERS} ON 1
FROM [Adventure Works]
WHERE
( [Product].[Product Categories].[Subcategory].&[] )
那么这种写法好在什么地方呢? 是因为 SUM 和 IIF 函数都是经过调优的可以在所谓的块模式下运行的,特别是当在 IIF() 函数中有一个分支的值是 NULL 的情况下是非常快的。 在现在我们的例子中可能看不出来这个效果,但是如果当数据量特别大的时候,就会发现 SUM-IIF 这种写法比起 FILTER-COUNT 这种写法在性能上有很大的提升。
其它 BI 博客系列看参看 - BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
MDX Cookbook 05 - 条件过滤 FILTER-COUNT 与 SUM-IIF 实现的更多相关文章
- java8 按条件过滤集合
//黄色部分为过滤条件list.stream().filter(user-> user.getId() > 5 && "1组".equals(user. ...
- 教你用Java web实现多条件过滤功能
生活中,当你闲暇之余浏览资讯的时候,当你搜索资料但繁杂信息夹杂时候,你就会想,如何更为准确的定位需求信息.今天就为你带来: 分页查询 需求分析:在列表页面中,显示指定条数的数据,通过翻页按钮完成首页/ ...
- JavaWeb项目之多条件过滤
相信很多同学在学习java基础之后,面对各种项目还是相当头疼,那今天我将手把手教你学会JavaWeb项目中的多条件过滤,希望你能在与我实战的过程中积累经验,更进一步. 分页查询 需求分析:在列表页面中 ...
- Django项目:CRM(客户关系管理系统)--23--15PerfectCRM实现King_admin多条件过滤
登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html list_filter = ('source','consultant','consult_co ...
- js数组Array根据动态条件过滤
数据 [{ "name": "张三", "score": 153 }, { "name": "李四" ...
- 使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值
不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常: java.lang.NullPointerException java.ut ...
- Mysql命令-以NULL做where条件过滤时应该写 IS NULL;
以NULL做where条件过滤时应该写 IS NULL;SELECT * FROM pet WHERE death IS NULL; SELECT * FROM pet WHERE death IS ...
- fiddler 按条件过滤
使用fiddler抓包过程中最希望获取自己想要的数据,不重要的信息最希望的是过滤,如果重要和不重要的数据都展示对我们在寻找资源的时候产生了很大的干扰,所以我们需要按条件过滤: 1.启用fiddler ...
- MongoDB(课时13 where条件过滤)
3.4.2.8 条件过滤 关系型数据库开发对于数据的筛选,想到的一定是where语句,MongoDB里面提供的是"$where". 范例:使用where进行数据的查询 db.stu ...
随机推荐
- 性能测试十三:linux常用命令
常用的linux命令: 目录类/ 根目录. 当前目录.. 上级目录cd / 进入根目录cd .. 进入上级目录ls 查看当前目录下的所有文件ll 查看当前目录下所有文件的详细信息pwd 显示当前目录的 ...
- 算法-----python实现
斐波那契数列 def f(n): if n == 1: return 1 elif n == 2: return 1 else: return f(n-1)+f(n-2) print(f(8)) 用普 ...
- python 全栈开发,Day16(函数第一次考试)
考试题 Python11 期第二次考试(基础数据类型与函数部分) 考试时长:3个小时 满分:105分 一,选择题(每题2分,共24分) 1.python不支持的数据类型有 A.char B.int C ...
- Zookeeper笔记(二)Paxos算法与Zookeeper的工作原理
Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目, 它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管 ...
- Python 模块介绍
一.模块:用一坨代码实现了某个功能的代码集合. 二.模块分为三种 1.自定义模块 2.内置标准模块(又称标准库) 3.开源模块(上传方式,百度PyPi) 开源模块安装方式: a.yum b.pip c ...
- 响应式web布局设计实战总结教程
响应性web设计的理念是:页面的设计与开发应当根据用户行为与设备环境(包括系统平台,屏幕尺寸,屏幕定向等)进行相应的响应及调整.具体的实践方式由多方面组成,包括弹性网格和布局,图片,css Media ...
- 汇编之 eax, ebx, ecx, edx, esi, edi, ebp, esp??
一般寄存器:AX.BX.CX.DXAX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI.DISI:来源索引暂存器,DI:目的索引暂存器 堆叠.基底暂存器:SP.BP ...
- spring security 获取当前用户信息
1.从页面上显示当前登陆的用户名 sec:authentication="name" <html xmlns:th="http://www.thymeleaf.or ...
- BeanUtils进行日期格式的拷贝转换
自定义Converter的方法: import java.text.ParseException; import java.text.SimpleDateFormat; import org.apac ...
- Ubuntu 开机自启动SSH+远程关机
Ubuntu 开机自启动SSH+远程关机 安装SSH 如何通过ssh远程登录linux系统 开机自启动ssh sudo gedit /etc/rc.locl # 输入密码 # 添加下面命令于 ex ...