2010-09-10 175 views
1

我需要一個MDX查詢,它根據度量的累計和返回前N%的行。棘手的部分是該組必須基於與用於總和的不同度量來進行排序,所以使用TopPercent函數是不可能的。在MDX中計算累計總和

爲了說明我需要什麼,下面是一個例子。我想盡可能少地購買至少1000克肉。但是,這不僅僅是包裝的重量,我想要質量,所以我想優先考慮含有最高比例肉類的產品。可用的產品是這些:

|| Name  || Weight || PercentageOfMeat || 
| Product 1 | 500  | 20    | 
| Product 2 | 250  | 60    | 
| Product 3 | 1000 | 25    | 
| Product 4 | 400  | 50    | 
| Product 5 | 400  | 40    | 

因此,要得到我想要的,我會第一個排序遞減通過PercentageOfMeat,以滿足我的首要任務。然後,我會累計產品的權重,直到達到1000克的限制。結果應該是產品2,產品4和產品5.這很簡單。

但在MDX中可以這樣做嗎? TopPercent(或者在該示例的情況下,TopSum)否則會是完美的,但它不允許我使用不同的排序和求和措施。如果我只想要最重的產品,它就會奏效。要引用文檔,函數:

按降序排列集合,並返回累積總數等於或大於指定百分比的最高值的元組集合。

我基本上需要的是TopPercent函數不排序集,但據我所知,沒有。那麼是否有可能做我想做的或者我必須在服務器代碼中進行計算?

回答

5

如何組合訂單(),首先根據肉類的百分比對產品進行分類,然後根據其累計重量過濾()它們?

在[艾德]下面的代碼是呈現出最有序的山地自行車,其累計銷售額爲低到一定值:

with 

    set [mbikes] as order([Product].[Product Categories].[mountain bikes].children, [order count], BDESC) 

select 

    { [order count], [sales amount] } on 0, 

    filter([mbikes], sum(subset([mbikes], 0, [mbikes].currentOrdinal), [sales amount]) < (8 * 1000 * 1000) ) on 1 

from [adventure works] 

給予以下:

      Order Count Sales Amount 
Mountain-200 Black, 38   743  $2,589,363.78 
Mountain-200 Black, 42   671  $2,265,485.38 
Mountain-200 Silver, 38   641  $2,160,981.60 
+0

謝謝。我還沒有能夠嘗試這種解決方案,但它似乎值得一試。 – Carlos 2010-09-11 16:04:57

+0

給我完全我想要的結果,所以再次感謝你。唯一的問題是它很慢,所以我必須看看我是否可以真正使用它。 – Carlos 2010-09-13 08:03:24

+0

還有一個小問題,我希望至少得到1000克肉。該解決方案不會在結果中包含會導致總計超過1000克的產品。所以它只返回一個產品。 – Carlos 2010-09-13 08:30:18