質問
測定値の累積合計に基づいて、行の上部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 |
ですから、私が望むものを手に入れるために、私は最初に私の最優先事項を満たすためにパーセンテージミートで降りて並べ替えます。次に、1000グラムの制限に達するまで、製品の重みを累積的に合計します。結果は、製品2、製品4、製品5になります。これは十分に簡単です。
しかし、これをMDXで行うことは可能ですか? TopPercent
(または例の場合、 TopSum
)それ以外の場合は完璧ですが、並べ替えと合計にさまざまな手段を使用することはできません。私が最も重みを持っている製品だけを望んでいたら、それはうまくいくでしょう。ドキュメントを引用するには、関数:
セットを降順で並べ替え、累積合計が指定された割合以上の累積値を持つ最高値のタプルのセットを返します。
基本的に必要なのはです TopPercent
セットをソートしない関数ですが、私が知る限り、何もありません。それで、私が望むことをすることは可能ですか、それともサーバーコードでこれを計算する必要がありますか?
解決
最初に注文()を組み合わせて、肉の割合に従って製品をソートしてから、累積重量に応じてフィルター()を整理してみませんか?
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