2016-03-24 11 views
2

Ich versuche, einen Datenwürfel zu implementieren, wobei ich den Durchschnitt und den Median eines Maßes für eine gegebene Menge von Dimensionen anzeigen kann. Einfaches Beispiel mit AdventureWorksDW:MDX MEDIAN() Funktion falsche Ergebnisse

WITH 
    MEMBER [Measures].[Median Qty] AS 
    MEDIAN ([Product].[Product Categories].siblings, [Measures].[Reseller Sales-Order Quantity]) 
    MEMBER [Measures].[avgOrderSize] AS 
    CASE 
     WHEN [Measures].[Reseller Sales Count] = 0 THEN NULL 
     ELSE ([Measures].[Reseller Sales-Order Quantity]/[Measures].[Reseller Sales Count]) 
    END 

SELECT {[Measures].[Reseller Sales-Order Quantity], [Measures].[Median Qty], [Measures].[avgOrderSize]} ON 0, 
NON EMPTY([Product].[Product Categories].[Category]) ON 1 
FROM [Analysis Services Tutorial] 
WHERE ([Product].[Product Name].&[476]); 

Die Ausgabe lautet:

Median output

Meine [Measures].[avgOrderSize] korrekt ist, wie es mit den konkreten Maßnahmen in der Abfrage zurückgegeben werden angezeigt. Allerdings ist die [Measures].[Median Qty] überhaupt nicht korrekt für meine Anforderungen. Ich hätte allerdings den Wert um 6 (da mein AdventureWorksDW2012 344 Reseller-Bestellungen hat, die dieses Produkt enthalten). Es sieht so aus, als ob der MEDIAN() über den gesamten Satz von Produkten funktioniert?

Ich habe Variationen anprobiert [Product].[Product Categories].siblings[Product].[Product Name].CurrentMember einschließlich, die den gleichen Wert wie der Reseller Sales-Order Menge zurück Was mache ich falsch und wie kann ich die MEDIAN() Funktion zu handeln bekommen wie ich erwarte?

+0

Haben Sie eine degenerierte Dimension, die ein Dimensionselement für jede Reseller-Reihenfolge hat (in Ihrem echten Würfel meine ich)? Welche Version von SSAS und ist es Enterprise Edition? – GregGalloway

+0

@GregGalloway Wir haben degenerierte Dimensionen in unseren realen Daten. Ich hoffe, MEDIAN zuerst in den AW-Daten zu verstehen, damit ich etwas zum Testen und Vergleichen habe. Wir verwenden SSAS 2012 Standard Edition. – wergeld

Antwort

1

Warnung. Dies wird langsam sein. Aber es sollte stimmen. Ich fürchte, Median ist nur eine teure Rechnung. Der erste Parameter sollte eine degenerierte Dimension und ein Attribut sein, das in der Faktentabelle ein Element pro Zeile enthält.

WITH 
    MEMBER [Measures].[Median Qty] AS 
    MEDIAN (EXISTING [Reseller Sales].[Reseller Sales Order Number].[Reseller Sales Order Number].Members, [Measures].[Reseller Sales-Order Quantity]) 
    ... 
+0

Ich habe das ein bisschen modifiziert, um mit meiner Version der AW-Dimensionen zu arbeiten. Und es scheint zu erwarteten Ergebnissen zurückzukehren. Dies als die Antwort markieren. Dies wird jedoch nicht in unserem Live-OLAP funktionieren, da unsere degenerierte Dimension aufgrund der 4 GB-Dateigrößenbeschränkung fehlschlägt (das war ein ordentlicher Fehler). Es scheint, dass wir Perzentile bei Verwendung von OLAP nicht anzeigen können. – wergeld

+0

@wergeld gibt es eine Einstellung, um größere Dimensionen zuzulassen: https://technet.microsoft.com/en-us/library/gg471589(SQL.110).aspx aber ich vermute MEDIAN über diese Größe Dimension ist sinnlos langsam. – GregGalloway

+0

@GregGalloway wieso hat das nicht funktioniert?'VORHANDEN [Produkt]. [Produktkategorien] .siblings' (Ich habe diesen Testwürfel nicht - er unterscheidet sich von den AdvWrks, auf die ich Zugriff habe) – whytheq

0

ich nicht mit dieser Funktion noch nicht, aber ein paar Dinge gespielt haben, sind Sie könnten versuchen:

die EXISTING Schlüsselwort der Berechnung hinzufügen:

WITH 
    MEMBER [Measures].[Median Qty] AS 
    MEDIAN ( 
     EXISTING [Product].[Product Categories].siblings 
     , [Measures].[Reseller Sales-Order Quantity] 
    ) 
... 

Fügen Sie die Exists Funktion obwohl dies wahrscheinlich sehr ähnlich wie oben:

WITH 
    MEMBER [Measures].[Median Qty] AS 
    MEDIAN ( 
     EXISTS([Product].[Product Categories].siblings, [Product].[Product Name].&[476]) 
     , [Measures].[Reseller Sales-Order Quantity] 
    ) 
... 

Versuchen Sie folgendes:

WITH 
    MEMBER [Measures].[Median Qty] AS 
    MEDIAN ( 
     [Product].[Product Categories].currentmember.siblings 
     , [Measures].[Reseller Sales-Order Quantity] 
    ) 
... 
+0

Ich habe sowohl "EXISTING" als auch "EXISTS" ausprobiert und dies liefert nur den gleichen Wert wie "Reseller Sales-Order Quantity", also 2881 (für dieses Produkt). Es sieht so aus, als würde der MEDIAN den gesamten Satz, der das Produkt enthält (gut), nur auf der aggregierten Ebene (schlecht) durchführen, so dass MEDIAN nur für den Einzelwert der Menge berechnet wird. – wergeld

+0

@wergeld Ich habe einen dritten Versuch hinzugefügt! Dies ist von der Anzeige des Beispiels hier: https://msdn.microsoft.com/en-us/library/ms145570.aspx?f=255&MSPPError=-2147217396 – whytheq

+0

Dies gibt den gleichen Wert wie meine erste Abfrage - 1030.5. Ich muss etwas Einfaches vermissen - ich weiß einfach nicht, was es ist. – wergeld