代码改变世界

随笔分类 -  04 - MDX

微软BI 之SSRS 系列 - 如何在 MDX 查询中获取有效的 MEMBER 成员属性作为参数传递

2014-01-09 23:19 by BIWORK, 2425 阅读, 收藏, 编辑
摘要: 这篇小文章的来源是天善问答,比如在报表中要根据点击某一个成员名称然后作为参数传递给自身报表或者下一张报表,这个在普通的 SQL 查询中没有任何问题。但是在 MDX 中查询是有区别的,比如在 MDX 中显示在报表上的结果是 Category 下的一个分类 Bikes,但是当点击了Bikes之后把 Bi... 阅读全文

MDX 查询原型

2014-01-05 21:29 by BIWORK, 973 阅读, 收藏, 编辑
摘要: 本篇文章记录 SBS 中 MDX 查询原型,可以根据这些查询原型来解决实际项目中的问题。1. 查询在 2004年1月2日 - 2004年3月1日之间购买过 Bikes 产品的用户。SELECT ([Product].[Category].[Bikes],[Measures].[Internet Sales Amount]) ON COLUMNS, NON EMPTY [Customer].[Customer].[Customer].MEMBERS ON ROWSFROM [Step-by-Step]WHERE ([Date].[Calendar].[Date].&[20040102.. 阅读全文

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

2013-12-05 22:37 by BIWORK, 1663 阅读, 收藏, 编辑
摘要: 先认识一下这几个名词 Moving Average (MA) 移动平均,或者叫做移动平均线,是技术分析中一种分析时间序列数据的工具。最常见的就是利用股价,回报或交易量等变数计算出移动平均。可以利用移动平均反映出长期趋势或周期,在数学上这个也叫做卷积 Rolling Average。还有一个概念叫做 SMA (Simple Moving Average 简单移动平均),是指某个变数之前 N 个数值的累加平均。比如,收市价的10日简单移动平均是指之前10日收市价的平均数,那么这里就可以使用 SMA 10 来表示。先看看每天的网络订单数量的情况 -我们要在这个基础上看看 2006年开始 SMA 30 阅读全文

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

2013-12-05 22:32 by BIWORK, 4104 阅读, 收藏, 编辑
摘要: 这一小节主要介绍如何在一个平行期间的度量值,当前值的对比对象是指当前值的上一年,上一个季度或者其它时间级别上与当前值同一时间点上的的那个对象。有一个非常常见的需求就是对比上一年同一个时间点的某个值来判断在现在同期的时候这个值的大小是上升了还是下降了。先显示基于月份成员的销售额情况 -使用 PARALLELEPRIOD(Level, N, Member) 先把同比值查询出来,Level 指定的是年,1 表示 1年前,Member 就是指当前成员并且表示月。所以整个表达的意思就是查询当前成员1年前的相对应的那个月的 Reseller Sales Amount 的值是多少。WITHMEMBER [M 阅读全文

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

2013-12-05 22:15 by BIWORK, 4291 阅读, 收藏, 编辑
摘要: 在这个小节中我们将计算度量值的 Year To Date 的值,也就是计算从年开始到当前时间成员为止的度量值的累加结果。下面的这个查询显示了所有以周为单位的 Reseller Sales Amount -那么如果要计算上图中以周为单位的累加值,应该如何处理? 比如说现在是 Week 28 CY 2005,那么它的 YTD 累加值就是 Week 27 CY 2005 的度量值 + Week 28 CY 2005 度量值。WITHMEMBER [Measures].[Reseller Sales YTD]AS SUM( YTD([Date].[Calendar Weeks].C... 阅读全文

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

2013-12-03 16:58 by BIWORK, 541 阅读, 收藏, 编辑
摘要: 递归的应用有时是非常重要的,特别在迭代一个集合的时候。为什么这么说呢?原因在于迭代在MDX中的使用是基于集合函数的,像 GENERATE() 它们都需要遍历整个集合。但是如果这个集合非常的庞大,我们仅仅只需要在集合中查找一部分特定的东西,那么能够在找到需要的内容时就立刻停止的话,这就可以提高不少效率了。下面这个查询返回4个财年以及它们总共的 Order Count -SELECT{[Measures].[Order Count]} ON 0,NON EMPTY{Descendants([Date].[Fiscal Weeks].[All Periods], 1, SELF_AND_BEFO.. 阅读全文

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

2013-12-02 23:50 by BIWORK, 730 阅读, 收藏, 编辑
摘要: 第一个示例:查看所有包括黑色产品的子目录产品中的 Reseller Order Quantity 和 Reseller Order Count。第二个示例:和第一个示例查询结构一样,只是筛选的是大小为 XL 的产品子目录,并且只有 Jerseys 一个返回。那么如果要在这里面表达 OR 的关系,即产品为黑色的或者大小为 XL 的产品子目录有哪些? 可以这样来实现 -SELECT { [Measures].[Reseller Order Quantity], [Measures].[Reseller Order Count] } ON ... 阅读全文

MDX Cookbook 06 - GENERATE 循环遍历

2013-12-02 23:45 by BIWORK, 722 阅读, 收藏, 编辑
摘要: 有时候需要从集合中取出特定的成员但是又不能执行遍历操作,这个时候就可以使用 GENERATE 函数来解决这个问题。根据地区查询每年的销售额 -SELECTNON EMPTY { [Date].[Calendar].[Calendar Year].MEMBERS * [Measures].[Sales Amount]} ON 0,NON EMPTY { [Sales Territory].[Sales Territory Country].MEMBERS } ON 1FROM [Adventure Works]现在需要查询每年销售额最高的那个月在各个地区的销售情况。WITH SET [Best 阅读全文

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

2013-12-02 23:40 by BIWORK, 2616 阅读, 收藏, 编辑
摘要: 下面的这个查询返回每个财月的 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 1FROM [Adventure Works]WHERE( [Product].[Product C... 阅读全文

微软BI 之SSRS 系列 - 基于时间段参数的 MDX 查询以及时间日历 Date Picker 的时间类型参数化

2013-11-28 15:13 by BIWORK, 4508 阅读, 收藏, 编辑
摘要: 今天在天善问答里看到一个问题,如果我没有理解错的话,它应该是指比如在一个报表中选取一个时间段,然后求出这个时间段的某个 Measure 的 SUM 和。并且同时求出这两个时间点对应的上一年的时间点之间的同一个 Measure 的 SUM 和。比如当前选取的时间点是 2004年1月8日,结束时间点是 ... 阅读全文

MDX Step by Step 读书笔记(八) - Navigating Hierarchies 层次结构导航

2013-11-22 17:13 by BIWORK, 3188 阅读, 收藏, 编辑
摘要: 开篇介绍本章主要内容包括:解释各种不同的 MDX 导航函数的使用: Parent, Children, FirstChild, LastChild, Siblings, FirstSibling, LastSibling, RANK通过导航函数定位层次结构中的成员: Ancestor, Ancest... 阅读全文

MDX Step by Step 读书笔记(九) - Working with Time 处理时间

2013-11-21 17:08 by BIWORK, 4236 阅读, 收藏, 编辑
摘要: 开篇介绍这一章节主要用到的 MDX 函数:PeriodsToDate( [Level , [Member]] )- 从指定级别的范围内,返回与指定成员同一级别,从第一个期间开始到指定成员结束的期间集。Ytd( [Member] )Qtd( [Member] )Mtd( [Member] )Wtd( ... 阅读全文

MDX Step by Step 读书笔记(七) - Performing Aggregation 聚合函数之 Max, Min, Count , DistinctCount 以及其它 TopCount, Generate

2013-11-06 00:27 by BIWORK, 3573 阅读, 收藏, 编辑
摘要: MDX 中最大值和最小值MDX 中最大值和最小值函数的语法和之前看到的 Sum 以及 Aggregate 等聚合函数基本上是一样的:Max( {Set} [, Expression])Min( {Set} [, Expression])直接看例子,先查询出所有 Sub Category 下的 Res... 阅读全文

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

2013-11-04 23:40 by BIWORK, 2041 阅读, 收藏, 编辑
摘要: 有时需要从一些查询结果里排除掉一些成员,当然平常情况下可以通过 MDX 查询中的 WHERE 条件即 Slicer 切片来完成,同样的这里显示的是如何在切片中排除掉一些成员。先看这一个查询 -SELECT { [Measures].[Reseller Order Count] } ON 0,NON EMPTY {[Promotion].[Promotion].MEMBERS }DIMENSION PROPERTIES [Promotion].[Promotion].[Discount Percent]ON 1FROM [Adventure Works]上面的查询返回了12个 Promotion 阅读全文

MDX Step by Step 读书笔记(七) - Performing Aggregation 聚合函数之 Sum, Aggregate, Avg

2013-11-04 23:30 by BIWORK, 4928 阅读, 收藏, 编辑
摘要: 开篇介绍SSAS 分析服务中记录了大量的聚合值,这些聚合值在 Cube 中实际上指的就是度量值。一个给定的度量值可能聚合了来自事实表中上千上万甚至百万条数据,因此在设计阶段我们所能看到的度量实际上就已经应用了某些聚合函数来决定这个值怎样被聚合。当然有可能已有的度量值远远还不够,还需要在查询的时候继续... 阅读全文

MDX Cookbook 03 - MDX 查询中负数,零和空值 NULL 的格式化处理

2013-10-23 21:48 by BIWORK, 1710 阅读, 收藏, 编辑
摘要: FORMAT_STRING 属性在处理计算成员(通常是度量值成员)的时候会经常使用到,比如指定标准 Standard, 货币 Currency 或者 Percent 百分比格式。除此之外,还可以自定义一些格式化方式,通常对处理负数,零和空值非常有用。CREATE MEMBER [Adventure Works].[Measures].[Gross Profit formatted]AS[Measures].[Sales Amount] - [Measures].[Total Product Cost],FORMAT_STRING = "#,##0;- #,##0; 0 ;N/A&qu 阅读全文

MDX Cookbook 02 - 除数为零的问题

2013-10-23 21:37 by BIWORK, 870 阅读, 收藏, 编辑
摘要: 先直接看一个例子 -WITHMEMBER [Date].[Calendar Year].[CY 2006 vs 2005 Bad]AS[Date].[Calendar Year].[Calendar Year].&[2006] /[Date].[Calendar Year].[Calendar Year].&[2005],FORMAT_STRING = 'Percent'SELECT{[Date].[Calendar Year].[Calendar Year].&[2005],[Date].[Calendar Year].[Calendar Year]. 阅读全文

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

2013-10-23 21:26 by BIWORK, 1061 阅读, 收藏, 编辑
摘要: 假设我们只想显示一些与数据没有任何关联的维度成员信息,并且希望它们能够以行集的形式来显示,那么在 MDX 中就应该直接显示 ROWS AXIS (1) 并且忽略掉 COLUMNS AXIS(0)。比如说有100个成员信息,如果是一列100行的形式通常符合大家的查询习惯,如果是一行100列,读起来就比较困难。需要了解的是 SELECT 语句最多可以支持 128 个轴,轴的序号从 0 ~ 127,但是基本上我们不会使用的到那么多, 一般只使用前两个, 即我们常用的 COLUMNS 和 ROWS, 因为大多数客户端工具只能支持到二维即显示行和列。并且是使用这些轴的名称的时候, 他们的顺序必须是连续的 阅读全文

BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

2013-09-18 18:25 by BIWORK, 38024 阅读, 收藏, 编辑
摘要: 微软 BI ETL 架构设计 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改的记录数 微软 BI SSIS 系列 微软BI 之SSIS 系列 - 在 SSIS 中读取 Shar 阅读全文

MDX Step by Step 读书笔记(六) - Building Complex Sets (复杂集合的处理) - Generate 和 Extract 函数的使用

2013-04-28 17:44 by BIWORK, 2368 阅读, 收藏, 编辑
摘要: Performing Advanced Set ConstructionAssembling Sets with the Generate Function如果你对C#或者VB 等其它变成语言熟悉的话,应该对循环比较熟悉。在循环中,可以遍历集合里的每一个对象,在遍历的时候,对对象会执行一些操作。换一... 阅读全文