1

メジャーの累積合計に基づいて行の上位Nパーセントを返すMDXクエリが必要です。トリッキーな部分は、セットが合計に使用されるものとは異なるメジャーに基づいて順序付けられる必要があるため、TopPercent関数を使用できないことです。

必要なものを明確にするために、ここに例を示します。できるだけ少ないパッケージで少なくとも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なのはセットをソートしない関数ですが、私が知る限り、何もありません。それで、私がやりたいことをすることは可能ですか、それともサーバーコードでこれを計算する必要がありますか?

4

1 に答える 1

5

最初にOrder()を組み合わせて、肉の割合に従って製品を並べ替え、次に累積重量に従ってFilter()を組み合わせてみませんか?

[Adventure Works]では、次のコードは、累積販売額が特定の値よりも低い、最も注文の多いマウンテンバイクを示しています。

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
于 2010-09-11T13:02:03.963 に答える