Frage

Ich brauche eine MDX-Abfrage, die die Top-N Prozent der Zeilen zurückgibt, basierend auf einer kumulativen Summe von einer Maßnahme. Der schwierige Teil ist, dass der Satz muss auf einer anderen Maßnahme angeordnet werden, als für die Summe verwendet wird, so mit der TopPercent Funktion nicht möglich ist.

Um zu klären, was ich brauche, hier ist ein Beispiel. Ich möchte wie möglich in möglichst wenigen Pakete mindestens 1000 Gramm Fleisch kaufen. Es ist jedoch nicht nur um das Gewicht des Pakets, ich will Qualität, so dass ich priorisieren will Produkte, die den höchsten Anteil an Fleisch enthalten. Die zur Verfügung stehenden Produkte sind diese:

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

Also, bekommen, was ich will, würde ich zuerst sortieren absteigend nach PercentageOfMeat meine erste Priorität zu erfüllen. Dann würde ich die Gewichte der Produkte kumulativ summieren, bis ich die 1000 Gramm-Grenze erreichen. Das Ergebnis sollte Produkt sein 2, Artikel 4 und Artikel 5. Das ist einfach genug.

Aber ist es möglich, dies in MDX zu tun? TopPercent (oder im Falle des Beispiels TopSum) würde sonst perfekt sein, aber es erlaubt mir nicht, verschiedene Maßnahmen zum Sortieren und Summieren zu verwenden. Wenn ich wollte nur die Produkte, dass das Gewicht der meisten, dass es funktionieren würde. Um die Dokumentation zu zitieren, die Funktion:

Sortiert eine Reihe in absteigender Reihenfolge und gibt eine Menge von Tupeln mit den höchsten Werten, deren kumulativen Summe gleich oder größer als ein bestimmten Prozentsatz.

Was ich im Grunde Notwendigkeit TopPercent Funktion ist, die nicht sortieren die Menge tut, aber soweit ich weiß, gibt es keine. So ist es möglich, zu tun, was ich will oder muss ich diesen Code in Server berechnen?

War es hilfreich?

Lösung

Wie wäre es eine Order Kombinieren () zuerst Ihre Produkte zu erhalten, sortiert nach ihrem Anteil an Fleisch und dann Filter (), um sie entsprechend ihrer kumulativen Gewicht?

In [Adventure Works] Der folgende Code zeigt die meisten bestellten Mountainbikes, deren kumulierte Umsatz Betrag niedriger auf einen bestimmten Wert:

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]  

Geben Sie die folgende:

                          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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top