MDX Cookbook 08 - 基于集合上的迭代递归
递归的应用有时是非常重要的,特别在迭代一个集合的时候。为什么这么说呢?原因在于迭代在MDX中的使用是基于集合函数的,像 GENERATE() 它们都需要遍历整个集合。但是如果这个集合非常的庞大,我们仅仅只需要在集合中查找一部分特定的东西,那么能够在找到需要的内容时就立刻停止的话,这就可以提高不少效率了。
下面这个查询返回4个财年以及它们总共的 Order Count -
SELECT
{[Measures].[Order Count]} ON 0,
NON EMPTY
{Descendants([Date].[Fiscal Weeks].[All Periods],
1,
SELF_AND_BEFORE)
} ON 1
FROM [Adventure Works]
现在来看看基于 Week 级别计算Daily 平均值,并且 Week 级别的平均值是基于年 Year 级别的。
WITH
MEMBER [Measures].[Average of an average] AS
IIF(
IsLeaf([Date].[Fiscal Weeks].CurrentMember),
[Measures].[Order Count],
AVG(
[Date].[Fiscal Weeks].CurrentMember.Children,
[Measures].[Average of an average]
)
)
, FORMAT_STRING = '#,#'
SELECT
{[Measures].[Order Count],[Measures].[Average of an average]} ON 0,
NON EMPTY
{Descendants([Date].[Fiscal Weeks].[All Periods],
1,
SELF_AND_BEFORE)
} ON 1
FROM [Adventure Works]
第一行的结果是 ALL Periods 这个成员的,它的结果是根据它的下一层级上年计算平均值得到的,(56+84+435+195)/4 = 193。 那么年这个层次上的结果是根据 Weekly Value 求平均值计算出来的,只不过在这里没有显示而已。
为了实现递归,我们必须在同一个计算成员中指定一个表达式,这个表达式中也会使用到当前的计算成员。为了停止这个递归过程,必须有一个条件失去对自身计算成员的引用。
分析一下我们的这个例子,首先 Fiscal Years 不是 Fiscal Weeks 的叶节点,因此在 IIF() 函数中为 False。那么就会走向下面这段代码为它下面的子集成员计算平均值,那么在计算子集成员的平均值的时候,由于继续引用了自身定义的 [Measures].[Average of an average],因此将接着继续计算子集成员的子集直到最下面的子集成员是叶成员为止。
AVG(
[Date].[Fiscal Weeks].CurrentMember.Children,
[Measures].[Average of an average]
)
更多 BI WORK 博客系列看参看 - BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
MDX Cookbook 08 - 基于集合上的迭代递归的更多相关文章
- MDX Cookbook 04 - 在集合中实现 NOT IN 逻辑 (Minus, Except, Filter 等符号和函数的使用)
有时需要从一些查询结果里排除掉一些成员,当然平常情况下可以通过 MDX 查询中的 WHERE 条件即 Slicer 切片来完成,同样的这里显示的是如何在切片中排除掉一些成员. 先看这一个查询 - , ...
- 08 Java 集合的线程安全问题
1 Java中的集合 Java中的集合分为同步的集合(线程安全)和线程不安全的集合 例如 : ArrayList和Vector的区别: 一.同步性:Vector是线程安全的,也就是说是同步的,而Arr ...
- 基于集合成工控机Ubuntu系统安装分区详解
基于集合成工控机Ubuntu系统安装分区详解 硬件描述:双核的CPU,128G的固态硬盘 软件描述:使用Ubuntu12.04系统,内核3.8.0-29版本,QT4.8.1版本 1.新建分区表 /de ...
- MDX Cookbook 06 - GENERATE 循环遍历
有时候需要从集合中取出特定的成员但是又不能执行遍历操作,这个时候就可以使用 GENERATE 函数来解决这个问题. 根据地区查询每年的销售额 - SELECT NON EMPTY { , NON EM ...
- 集合上的动态规划---最优配对问题(推荐:*****) // uva 10911
/* 提醒推荐:五星 刘汝佳<算法竞赛入门经典>,集合上的动态规划---最优配对问题 题意:空间里有n个点P0,P1,...,Pn-1,你的任务是把它们配成n/2对(n是偶数),使得每个点 ...
- 转:基于IOS上MDM技术相关资料整理及汇总
一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...
- 基于IOS上MDM技术相关资料整理及汇总
(转自:http://www.mbaike.net/special/1542.html) 一.MDM相关知识:MDM (Mobile Device Management ),即移动设备管理.在21世纪 ...
- django 基于form表单上传文件和基于ajax上传文件
一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...
- Oracle 12C -- 在相同的列的集合上创建多个索引
在12C中,可以在相同的列的集合上创建多个索引,但是多个索引的类型要不同.同一时刻,只有一个是可见的. SQL> create table emp_tab as select * from em ...
随机推荐
- git push origin master出错:error: failed to push some refs to
1.输入git push origin master 出错:error: failed to push some refs to 那是因为本地没有update到最新版本的项目(git上有README. ...
- python 全栈开发,Day51(常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍)
昨日内容回顾 1.三种引入方式 1.行内js <div onclick = 'add(3,4)'></div> //声明一个函数 function add(a,b){ } 2. ...
- jsp+servlet实现文件的上传和下载
实现文件的上传和下载首先需要理解几个知识,这样才可以很好的完成文件的上传和下载: (1):上传文件是上传到服务器上,而保存到数据库是文件名 (2):上传文件是以文件转换为二进制流的形式上传的 (3): ...
- POJ1151Atlantis 矩形面积并 扫描线 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1151 题意概括 给出n个矩形,求他们的面积并. n<=100 题解 数据范围极小. 我们分3种 ...
- Github+阿超运算
感谢自己寒假能够稍稍做一点努力. Github个人页面<构建之法阅读笔记二可见>: https://github.com/Heartxy8990 申请教程: http://jingyan. ...
- How to cast List<Object> to List<MyClass> Object集合转换成实体集合
List<Object> list = getList(); return (List<Customer>) list; Compiler says: cannot cast ...
- vscode下Python设置参考
用于VS代码的Python扩展是高度可配置的.此页面介绍了可以使用的关键设置. 请参阅用户和工作区设置,以了解有关在VS代码中使用设置的更多信息. 常规设置 设置 默认 描述 python.pytho ...
- Java 并发编程整体介绍 | 内含超多干货
前段时间一直在学习多线程相关的知识,目前也算有了一个整体的认识,今天呢,主要从整体介绍一下,只谈造火箭,拧螺丝这种细节还需要自己深究. 首先是操作系统级别对于多线程的支持,由 CPU 的多级缓存.缓存 ...
- go语言学习-数组-切片-map
数组 go语言中数组的特点: 数组的长度是固定的,并且长度也是数组类型的一部分 是值类型,在赋值或者作为参数传递时,会复制整个数组,而不是指针 定义数组的语法: var arr1 = [5]int{1 ...
- 如何通过<include/>标签重用Mybatis的代码段
1.首先定义一个sql标签,一定要定义唯一id<sql id="Base_Column_List" >name,age</sql>2.然后通过id引用< ...