MDX中一些边界问题的处理

在编写MDX中,各种各样的边界情况存在,比如:Member不存在,被0除,或则某个部分在cube和维度中并不存在等等,本文对这些情况下如何来处理做了一个小结。以下MDX语句可以在SSAS的示例库:Adventure Works中运行。 
 

Member不存在的情况

在使用Member的一些函数(比如:Lag,Lead,ParalledPeriod等)的时候,我们经常需要得到当前的Member相对的一个Member(比如:前一个Member,父级Member,或去年同期的一个Member等等)。然而由于维度和Hierarchy中的Member是有限的,所以这个相对的Member有时并不存在。在这种情况下,我们可以用IIF判断这个Member是否为Null来解决这个问题(z)。比方说,计算过去6个月的平均销售额。

 

MDX中一些边界问题的处理WITH MEMBER [Measures].[Last 6 Month Average Sales Amount] AS 
MDX中一些边界问题的处理IIF (
MDX中一些边界问题的处理    
[Date].[Calendar].CurrentMember.Lag(5IS NULL,
MDX中一些边界问题的处理    
NULL,
MDX中一些边界问题的处理    
Avg (
MDX中一些边界问题的处理        {
[Date].[Calendar].CurrentMember.Lag(5): [Date].[Calendar].CurrentMember},
MDX中一些边界问题的处理        
[Measures].[Internet Sales Amount]
MDX中一些边界问题的处理    )
MDX中一些边界问题的处理), FORMAT_STRING
="Currency"
MDX中一些边界问题的处理
SELECT 
MDX中一些边界问题的处理{
[Measures].[Internet Sales Amount][Measures].[Last 6 Month Average Sales Amount]ON 0,
MDX中一些边界问题的处理{
[Date].[Calendar].[Month].Members} ON 1
MDX中一些边界问题的处理
FROM [Adventure Works]
MDX中一些边界问题的处理
MDX中一些边界问题的处理


这里需要注意的是如果 Cell(也就是Turple)不存在也会发生和Member不存在的相同的问题,其实如果Member不存在,Cell是一定不存在的,所以“Member不存在的情况”也可以被看作是“Cell不存在的情况”。
 

Level错误的情况

有的时候,Axis中的Set包含了位于不同Level的Member,而且每个Level中对于Member的处理方式不同,这种情况下的处理也要小心。比方说,在计算每种产品和其所属SubCategory,Category的销售量的时候,对于产品我们需要显示其标准价格(List Price),我们可以象下面这样来写。

 

MDX中一些边界问题的处理WITH MEMBER [Measures].[Product List Price] AS 
MDX中一些边界问题的处理IIF (
MDX中一些边界问题的处理    
[Product].[Product Categories].CurrentMember.Level IS [Product].[Product Categories].[Product Name],
MDX中一些边界问题的处理    
[Product].[Product Categories].CurrentMember.Properties("List Price"),
MDX中一些边界问题的处理    
NULL
MDX中一些边界问题的处理)
MDX中一些边界问题的处理
SELECT 
MDX中一些边界问题的处理{
[Measures].[Internet Sales Amount],[Measures].[Product List Price]ON 0,
MDX中一些边界问题的处理{DESCENDANTS(
[Product].[Product Categories].[All][Product].[Product Categories].[Product Name], SELF_AND_BEFORE )} ON 1
MDX中一些边界问题的处理
FROM [Adventure Works]
MDX中一些边界问题的处理
MDX中一些边界问题的处理


被0除的情况
表达式出现0为除数的情况有两种:
1)Member, Cell(也就是Turple)不存在
SSAS中,如果Member, Cell不存在,其返回的值是0。比如:统计每个月每种产品的销售额时,但是有可能在某个月份某个产品由于没有卖出一个。这种情况下,上文已有说明。
2)Cell统计的值为0
比如:统计每个月份占所处季度利润百分比的时候,有可能该季度的利润为0。

无论是那种情况,对于被0除你可以用判断表达式是否为0来处理,像下面这样计算同期比:

 

MDX中一些边界问题的处理WITH MEMBER [Measures].[Same Period Ratio] AS     
MDX中一些边界问题的处理IIF (
MDX中一些边界问题的处理    (    
MDX中一些边界问题的处理        
[Measures].[Internet Sales Amount],
MDX中一些边界问题的处理        ParallelPeriod(
MDX中一些边界问题的处理            
[Date].[Calendar].[Calendar Year]
MDX中一些边界问题的处理            
1
MDX中一些边界问题的处理            
[Date].[Calendar].CurrentMember
MDX中一些边界问题的处理        )
MDX中一些边界问题的处理    ) 
= 0,
MDX中一些边界问题的处理    
NULL,
MDX中一些边界问题的处理    
[Measures].[Internet Sales Amount]/
MDX中一些边界问题的处理    (    
MDX中一些边界问题的处理        
[Measures].[Internet Sales Amount],
MDX中一些边界问题的处理        ParallelPeriod(
MDX中一些边界问题的处理            
[Date].[Calendar].[Calendar Year]
MDX中一些边界问题的处理            
1
MDX中一些边界问题的处理            
[Date].[Calendar].CurrentMember
MDX中一些边界问题的处理        )
MDX中一些边界问题的处理    ) 
- 1
MDX中一些边界问题的处理), FORMAT_STRING
="Percent"
MDX中一些边界问题的处理
SELECT 
MDX中一些边界问题的处理{
[Measures].[Internet Sales Amount][Measures].[Same Period Ratio]ON 0,
MDX中一些边界问题的处理NON EMPTY{DESCENDANTS(
[Date].[Calendar].[All Periods][Date].[Calendar].[Month], SELF)} ON 1
MDX中一些边界问题的处理
FROM [Adventure Works]
MDX中一些边界问题的处理
MDX中一些边界问题的处理

 

相关文章:

  • 2021-11-30
  • 2022-01-05
  • 2021-06-19
  • 2021-12-27
  • 2022-03-03
  • 2021-05-01
  • 2022-12-23
猜你喜欢
  • 2021-08-30
  • 2021-11-20
  • 2022-01-01
  • 2022-01-15
  • 2022-12-23
相关资源
相似解决方案