在MDX中處理邊界情況

bidwhome發表於2007-01-18
本文來源於《MDX Solutions with Microsoft SQL.Server Analysis Services 2005 and Hyperion Essbase 2nd Edition》一書的內容[@more@]本文來源於《MDX Solutions with Microsoft SQL.Server Analysis Services 2005 and Hyperion Essbase 2nd Edition》一書的內容。在編寫MDX中,各種各樣的邊界情況存在,比如:Member不存在,被0除,或則某個部分在cube和維度中並不存在等等,本文對這些情況下如何來處理做了一個小結。以下MDX語句可以在SSAS的示例庫:Adventure Works中執行。

Member不存在的情況

在使用Member的一些函式(比如:LagLeadParalledPeriod)的時候,我們經常需要得到當前的Member相對的一個Member(比如:前一個Member,父級Member,或去年同期的一個Member等等)。然而由於維度和Hierarchy中的Member是有限的,所以這個相對的Member有時並不存在。在這種情況下,我們可以用IIF判斷這個Member是否為Null來解決這個問題(z)。比方說,計算過去6個月的平均銷售額。這裡需要注意的是如果 Cell(也就是Turple)不存在也會發生和Member不存在的相同的問題,其實如果Member不存在,Cell是一定不存在的,所以“Member不存在的情況”也可以被看作是“Cell不存在的情況”。

在MDX中處理邊界情況WITH MEMBER [Measures].[Last 6 Month Average Sales Amount] AS
在MDX中處理邊界情況IIF (
在MDX中處理邊界情況
[Date].[Calendar].CurrentMember.Lag(5) IS 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中處理邊界情況

Level錯誤的情況

有的時候,Axis中的Set包含了位於不同LevelMember,而且每個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中處理邊界情況

0除的情況表示式出現0為除數的情況有兩種:1Member, Cell(也就是Turple)不存在SSAS中,如果Member, Cell不存在,其返回的值是0。比如:統計每個月每種產品的銷售額時,但是有可能在某個月份某個產品由於沒有賣出一個。這種情況下,上文已有說明。2Cell統計的值為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中處理邊界情況

本文來自:http://www.cnblogs.com/microsheen/archive/2006/11/11/557715.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7600305/viewspace-891196/,如需轉載,請註明出處,否則將追究法律責任。

相關文章