随笔-39  评论-289  文章-0  trackbacks-1
在做BI项目中,用户会经常提出类似下面这样的需求:
1. 本月比上月的销售额增长了多少?百分比是多少?
2. 本季度第一个月比上季度第一个月的销售额增长了多少?百分比是多少?

其实这两个需求就是我们常说的同比和环比问题,它们用关系数据库的SQL语句难于实现,而用BI中的MDX来做却轻而易举。以下例子采用的是SQL Server2005的Analysis Services中的示例库。

环比
需求:本月比上个月的销售额增长了多少个百分点?
MDX语句如下:
WITH MEMBER Measures.[Amount Change Rate] AS 
  
[Measures].[Internet Sales Amount]/
  (
[Measures].[Internet Sales Amount],[Date].[Fiscal].CurrentMember.PrevMember) -1
  , FORMAT_STRING 
= '0%'
SELECT 
{
[Measures].[Internet Sales Amount], Measures.[Amount Change Rate]ON 0,
[Date].[Fiscal].[Month].Members ON 1
FROM [Adventure Works]

结果如下:


上面的输出结果有一个问题,就是第一行数据会发生除0的情况,为了防止这种情况,MDX修改如下:
WITH MEMBER Measures.[Amount Change Rate] AS 
  IIF(ISEMPTY((
[Measures].[Internet Sales Amount],[Date].[Fiscal].CurrentMember.PrevMember)), "", 
   
[Measures].[Internet Sales Amount]/
  (
[Measures].[Internet Sales Amount],[Date].[Fiscal].CurrentMember.PrevMember) -1
  ), FORMAT_STRING 
= '0%'
SELECT 
{
[Measures].[Internet Sales Amount], Measures.[Amount Change Rate]ON 0,
[Date].[Fiscal].[Month].Members
 
ON 1
FROM [Adventure Works]

如果发现0为空,则显示空字符串。输出结果如下:



同比
需求:本季度每个月比上个季度同期销售额增长了多少个百分点?
WITH MEMBER Measures.[Change Amount Rate] AS 
 
[Measures].[Internet Sales Amount]/
 (  
[Measures].[Internet Sales Amount]
    Cousin(
[Date].[Fiscal].CurrentMember, [Date].[Fiscal].CurrentMember.Parent.PrevMember)
 ) 
- 1, FORMAT_STRING = '0%'   
SELECT {[Measures].[Internet Sales Amount], Measures.[Change Amount Rate]ON 0,
[Date].[Fiscal].[Month].Members ON 1
FROM [Adventure Works]

运行结果如下:


和环比相同,这里也出现了除0的情况,所以把MDX做如下修改:
WITH MEMBER Measures.[Change Amount Rate] AS 
  IIF(
    (
[Measures].[Internet Sales Amount]
     Cousin(
[Date].[Fiscal].CurrentMember, [Date].[Fiscal].CurrentMember.Parent.PrevMember)
    )=0
    , "", 
     
[Measures].[Internet Sales Amount]/
     (  
[Measures].[Internet Sales Amount]
        Cousin(
[Date].[Fiscal].CurrentMember, [Date].[Fiscal].CurrentMember.Parent.PrevMember)
     ) 
- 1
  ), FORMAT_STRING 
= '0%'   
SELECT {[Measures].[Internet Sales Amount], Measures.[Change Amount Rate]ON 0,
[Date].[Fiscal].[Month].Members ON 1
FROM [Adventure Works]

输出结果如下:


总结
同比和环比是BI项目中经常要做得内容,采用MDX语句可以轻松的实现这个需求。
posted on 2006-10-28 16:09 microsheen 阅读(3144) 评论(10)  编辑 收藏 网摘 所属分类: SQL ServerBI

评论:
#1楼 2006-10-28 21:41 | 拒绝潜水的鱼      
MDX语句 还没有用过 不知道怎么用呵呵
  回复  引用  查看    
#2楼[楼主] 2006-10-29 12:33 | microsheen      
我也是初学者阿!刚刚学几天的!~-~
  回复  引用  查看    
#3楼 2006-10-30 11:27 | ∈鱼杆      
楼主,MDX什么能介绍一下吗,BI项目是?问的菜,但也请回答一下。
  回复  引用  查看    
#4楼[楼主] 2006-10-30 13:00 | microsheen      
MDX全称Multidimensional Expression,即多维表达式,是用来在Cube(立方体)中查询数据的。BI全称Business Intelligence,即商业智能。详细的解释请看:http://www.chinabi.net/Article_Show.asp?ArticleID=195">http://www.chinabi.net/Article_Show.asp?ArticleID=195
  回复  引用  查看    
#5楼 2006-11-02 12:41 | andrewma      
can u give more notes about showed red portion below?
Cousin([Date].[Fiscal].CurrentMember, [Date].[Fiscal].CurrentMember.Parent.PrevMember)



  回复  引用  查看    
#6楼[楼主] 2006-11-02 16:19 | microsheen      
Cousin( Member_Expression , Ancestor_Member_Expression )函数的解释如下:
Member_Expression:一个Member。Ancestor_Member_Expression:一个Member。
该函数返回一个Member,这个Member位于Ancestor_Member_Expression下,它在Ancestor_Member_Expression中的相对位置和Member_Expression在它的祖先级别Member下的相对位置相同。见http://msdn2.microsoft.com/en-us/library/ms145481.aspx">MSDN解释


在实际的开发中Member_Expression也可以位于Ancestor_Member_Expression的祖先层次。另外使用ParallelPeriod可以实现相同功能


  回复  引用  查看    
#7楼 2008-05-02 17:03 | hanjoe[未注册用户]
很好,謝謝啦
  回复  引用    
#8楼 2009-05-19 09:28 | lide[未注册用户]
我有一个同比的难题是比较时间段的,比如今年5月20--6月3日同去年5月20--6月3日比较不知道怎么做?楼主帮忙解答一下?
  回复  引用    
#9楼 2009-06-30 14:50 | faxy521[未注册用户]
--引用--------------------------------------------------
lide: 我有一个同比的难题是比较时间段的,比如今年5月20--6月3日同去年5月20--6月3日比较不知道怎么做?楼主帮忙解答一下?
--------------------------------------------------------


这里的时间段可不可以自己随意来定义,而不是去年的和今年来比,就是自己来输任意两个时间段比较,

  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 542818




相关文章:

相关链接: