2012-07-03 68 views
2

這一直困擾着我,我不確定爲什麼這麼難。 我有一個測量值,直到某個時間點有空值,然後開始有值。我想獲得每月平均值,但僅限於那些實際上有非空值的月份。我也希望是固定我的時間範圍,查詢不管哪個月份有值(例如,在整個一年)MDX用月份的非空測量值累計數月

這裏是MDX的一個變化,我試圖:

WITH 
MEMBER Measures.MonthsWithSales AS 
    (IIF(IsEmpty(([Time].[Month].CurrentMember,[Measures].[ProductsSold])), 0, [Measures].[MonthCount])) 

MEMBER Measures.AvgProductsSold AS 
    [Measures].[ProductsSold] /Measures.MonthsWithSales 

SELECT 
{ 
[Measures].[ProductsSold], [Measures].[MonthCount], 
[Measures].[MonthsWithSales], [Measures].[AvgProductsSold] 
} ON 0, 

[Time].[Month].Members ON 1 

FROM MyCube 
WHERE [Time].[Year].&[2010-01-01T00:00:00] 

返回像這樣:

ProductsSold MonthCount MonthsWithSales AvgProductsSold 
All      1644 12 **12** **137** 
2010-01-01 00:00:00.000 (null) 1 0  (null) 
2010-02-01 00:00:00.000 (null) 1 0  (null) 
2010-03-01 00:00:00.000 (null) 1 0  (null) 
2010-04-01 00:00:00.000 (null) 1 0  (null) 
2010-05-01 00:00:00.000 (null) 1 0  (null) 
2010-06-01 00:00:00.000 234  1 1  234 
2010-07-01 00:00:00.000 237  1 1  237 
2010-08-01 00:00:00.000 236  1 1  236 
2010-09-01 00:00:00.000 232  1 1  232 
2010-10-01 00:00:00.000 232  1 1  232 
2010-11-01 00:00:00.000 233  1 1  233 
2010-12-01 00:00:00.000 240  1 1  240 

問題出在ALL行上。 我期望MonthsWithSales跨越年收益7不是12 和AvgProductsSold(每月銷售額)爲234.86不是137

我意識到,它沒有做我想要的東西,因爲它使用的MonthCount在ALL水平。但我不知道如何「陷入」「每月維度」,只在相關月份計算「全部」時總結MonthCount

+0

你能告訴我們月份層次結構的層次是什麼? – Benoit

回答

3

我假設你在月份層次結構上有兩個層次:一個是全部成員,一個是月份。

MEMBER Measures.AvgProductsSold AS 
      IIf([Time].[Month].CurrentMember.Level.Ordinal = 0 
        , Avg([Time].[Month].CurrentMember.Children, [Measures].[ProductsSold]) 
        , [Measures].[ProductsSold]) 

(你可以有[Time].[Month].Members更換[Time].[Month].CurrentMember.Children

Avg函數計算在非空值的平均值。

+0

這絕對比較接近,除了在整個時間維上給出平均值,而不僅僅是在我的WHERE子句中指定的日期範圍內。 (如果我使用MDX術語存在缺陷,請原諒我,我試圖將我的SQL專業知識應用到分析範例中)。 [Month]「層次結構」實際上是一個維度屬性,所以是[Year]。我的年齡,季度,月份,日期級別的時間維度上也有一個真正的「YQMD」層次結構。我應該用它來代替嗎? – JamieB

+0

好吧,我只需要:Avg(([Time]。[Year]。&[2010-01-01T00:00:00],[Time]。[Month] .CurrentMember.Children),[Measures]。[ProductsSold ])在成員定義中 – JamieB

1

這裏是我可能會最終使用,合理地利用我的時間層次結構查詢:

WITH 
MEMBER [Measures].[MonthsWithSales] 
AS 
COUNT 
(
    FILTER 
    (
     DESCENDANTS([Time].[YQMD].CurrentMember,[Time].[YQMD].[Month]), 
     NOT ISEMPTY([Measures].[ProductsSold]) 
    ) 
) 

MEMBER 
[Measures].[AvgProductsSold] 
AS 
[Measures].[ProductsSold]/[Measures].[MonthsWithSales] 

SELECT 
{ 
[Measures].[ProductsSold], 
[Measures].[MonthsWithSales], 
[Measures].[AvgProductsSold] 
} ON 0, 

[Time].[Month].Members ON 1 

FROM MyCube 

的[YQMD]是一個時間層次與級別:1年,2季度,3月,4日期