MDX Cookbook 02 - 除数为零的问题
先直接看一个例子 -
WITH
MEMBER [Date].[Calendar Year].[CY 2006 vs 2005 Bad]
AS
[Date].[Calendar Year].[Calendar Year].&[] /[Date].[Calendar Year].[Calendar Year].&[],
FORMAT_STRING = 'Percent'
SELECT
{
[Date].[Calendar Year].[Calendar Year].&[],
[Date].[Calendar Year].[Calendar Year].&[],
[Date].[Calendar Year].[CY 2006 vs 2005 Bad]
} *
[Measures].[Reseller Sales Amount] ON 0,
{ [Sales Territory].[Sales Territory].[Country].MEMBERS}
ON 1
FROM [Adventure Works]

首先在 Data 维度 [Calendar Year] 层次结构中定义一个计算成员 [CY 2006 vs 2005 Bad],因为默认的度量值是 [Reseller Sales Amount],因此表达式中的 [Date].[Calendar Year].[Calendar Year].&[2006] /[Date].[Calendar Year].[Calendar Year].&[2005] 表示的意思就是 2006 年零售额与 2005年零售额的比。
然后按 Country 分别来显示 2005年,2006年的销售额以及 2006年与2005年的销售额比。
为了在 SSRS 中显示,必须对这个代码做出一些改造 -
WITH
-- CY 2005 Reseller Sales Amount
MEMBER [Measures].[CY 2005 Reseller Sales Amount]
AS
([Date].[Calendar Year].[Calendar Year].&[],[Measures].[Reseller Sales Amount]) -- CY 2006 Reseller Sales Amount
MEMBER [Measures].[CY 2006 Reseller Sales Amount]
AS
([Date].[Calendar Year].[Calendar Year].&[],[Measures].[Reseller Sales Amount]) -- CY 2006 VS CY 2005
MEMBER [Measures].[CY 2006 vs 2005 Bad]
AS
[Measures].[CY 2006 Reseller Sales Amount] /[Measures].[CY 2005 Reseller Sales Amount],
FORMAT_STRING = 'Percent' SELECT {
[Measures].[CY 2005 Reseller Sales Amount],
[Measures].[CY 2006 Reseller Sales Amount],
[Measures].[CY 2006 vs 2005 Bad]
} ON COLUMNS,
{ [Sales Territory].[Sales Territory].[Country].MEMBERS} ON ROWS
FROM [Adventure Works];

从上面两个例子中查询结果来看,因为 CY 2005 中有一些 Reseller Sales Amount 是没有记录的,因此造成显示结果出现了 1.#INF 或者是 Infinity,这就是在除法运算的过程中分母为零的问题。
为了解决这样的问题,应该在除法元算的过程中添加条件判断。
MEMBER [Measures].[CY 2006 vs 2005 Bad]
AS
IIF([Measures].[CY 2005 Reseller Sales Amount] = 0 , NULL, [Measures].[CY 2006 Reseller Sales Amount] /[Measures].[CY 2005 Reseller Sales Amount]),
FORMAT_STRING = 'Percent'

为 NULL 的结果在 SSRS Report 上不会显示 -

本文涉及到的其它 MDX 知识点:
- 计算成员和动态表达式: MDX Step by Step 读书笔记(五) - Working with Expressions (MDX 表达式)
- 关于 IIF 性能和 MDX 中关于对 IIF 执行计划的有关文章: http://tinyurl.com/PerfGuide2008
- 有关 SSAS 性能的文档 Analysis Services Performance Guide: http://www.microsoft.com/en-us/download/details.aspx?id=17303
其它 BI 笔记请参照 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
MDX Cookbook 02 - 除数为零的问题的更多相关文章
- sql server中除数为零的处理技巧
在sql server中做除法处理的时候,我们经常需要处理除数为零的情况,因为如果遇到这种情况的时候,sqlserver会抛出遇到以零作除数错误的异常,我们总不希望把这个异常显示给用户吧. 做个会报这 ...
- sql server nullif的使用技巧,除数为零的处理技巧
在sql server中做除法处理的时候,我们经常需要处理除数为零的情况,因为如果遇到这种情况的时候,sqlserver会抛出遇到以零作除数错误的异常,我们总不希望把这个异常显示给用户吧. 做个会报这 ...
- MDX Cookbook 03 - MDX 查询中负数,零和空值 NULL 的格式化处理
FORMAT_STRING 属性在处理计算成员(通常是度量值成员)的时候会经常使用到,比如指定标准 Standard, 货币 Currency 或者 Percent 百分比格式.除此之外,还可以自定义 ...
- java语言中除数为零问题
在以下几个例子中,输出结果如何? float aa=0; System.out.println(aa/0); System.out.println(1/aa); System.out.println( ...
- MDX Cookbook 12 - 计算 SMA 简单移动平均 LastPeriods() 函数的使用
先认识一下这几个名词 Moving Average (MA) 移动平均,或者叫做移动平均线,是技术分析中一种分析时间序列数据的工具.最常见的就是利用股价,回报或交易量等变数计算出移动平均.可以利用移动 ...
- MDX Cookbook 11 - 计算 Year Over Year 增长 (同比计算) ParallelPeriod
这一小节主要介绍如何在一个平行期间的度量值,当前值的对比对象是指当前值的上一年,上一个季度或者其它时间级别上与当前值同一时间点上的的那个对象.有一个非常常见的需求就是对比上一年同一个时间点的某个值来判 ...
- MDX Cookbook 10 - 计算 Year To Date 的 Running Total(YTD 与 PeriodsToDate 的区别)
在这个小节中我们将计算度量值的 Year To Date 的值,也就是计算从年开始到当前时间成员为止的度量值的累加结果. 下面的这个查询显示了所有以周为单位的 Reseller Sales Amoun ...
- MDX Cookbook 08 - 基于集合上的迭代递归
递归的应用有时是非常重要的,特别在迭代一个集合的时候.为什么这么说呢?原因在于迭代在MDX中的使用是基于集合函数的,像 GENERATE() 它们都需要遍历整个集合.但是如果这个集合非常的庞大,我们仅 ...
- MDX Cookbook 07 - 在不同层次结构的成员中实现 逻辑 OR 的效果
第一个示例:查看所有包括黑色产品的子目录产品中的 Reseller Order Quantity 和 Reseller Order Count. 第二个示例:和第一个示例查询结构一样,只是筛选的是大小 ...
随机推荐
- js中数组去重
编写函数norepeat(arr) 将数组的重复元素去掉,并返回新的数组 [注]正序去重,会漏掉一些元素. [注]去重倒序. var arr = [10, 20, 30, 40, 30, 20, 20 ...
- 线上Slave报1062的案例
最近经常线上的Slave老报1062的错误,蛋碎一地,幸好Slave暂时没有用到业务上,也就是说没有做读写分离,所以Slave有问题,影响也不大,但每隔一阵子就报1062主键冲突的错误,让我好纠结,如 ...
- JavaScript: 认识 Object、原型、原型链与继承。
目录 引用类型与对象 类与对象 成员组成 成员访问 实例方法 / 属性 引用类型与对象 JavaScript 存在着两种数据类型:"基本数据类型" 与 "引用数据类型&q ...
- hdu 1596 乘积的最大值
一般题是 和的最小值 这个是乘积的最大值 Sample Input31 0.5 0.50.5 1 0.40.5 0.4 131 2 //起点 终点2 31 3 Sample Output0.5000. ...
- hihocoder 编程练习赛23
第一题:H国的身份证号码I 题意:一个N位的正整数(首位不能是0).每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K.按从小到大的顺序输出所有合法的N位号码,每个号码占一行. 思路:dfs ...
- python爬取糗百内容
#-*- coding: utf-8 -*- import urllib import urllib2 import re #页面为1 page=1 url='http://www.qiushibai ...
- BZOJ1036 [ZJOI2008]树的统计Count 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1036 题意概括 一个树,每个节点有一个权值.3种操作. 1:修改某一个节点的权值. 2:询问某两个 ...
- 022 Spark shuffle过程
1.官网 http://spark.apache.org/docs/1.6.1/configuration.html#shuffle-behavior Spark数据进行重新分区的操作就叫做shuf ...
- hdu 1002 A + B Problem II【大数加法】
题目链接>>>>>> 题目大意:手动模拟大数加法,从而进行两个大数的加法运算 #include <stdio.h> #include <strin ...
- scanf清除缓存区
为什么需要清除scanf缓存区呢?看一个例子: int main() { int a,b; scanf("%d",&a); scanf("%d",&am ...