2016-05-05 7 views
1

Ich habe eine scheinbar einfache Anforderung eine Abfrage von Preisdaten zu erstellen, die vier Sätze von Preisdaten für andere Daten zurück:Wie Datumsfeldes in MDX-Abfrage mit und ohne Aggregat Gruppe

  1. Das niedrigste Datum der Bereich
  2. das höchste Datum des Bereichs
  3. die Gesamtsumme für den gesamten Bereich

die nächstgelegene ich habe, ist die folgende Abfrage:

WITH set [Range] as {[Effective Date].[Date].&[2015-12-01T00:00:00] : [Effective Date].[Date].&[2015-12-31T00:00:00]} 
select 
NON EMPTY{ 
    filter([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price]), 
    filter([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price]), 
    nonempty([Measures].[Money In], [Range]), 
    nonempty([Measures].[Money Out], [Range]) 
} on 0, 
NON EMPTY{ 
[Region Manager].[Full Name].[Full Name] 
} on 1 
from [Cube] 

jedoch die Datumsbereiche als solche Rückkehr der Fehler:

Two sets specified in the function have different dimensionality.

Der „Filter“ oder „nicht leer“ Aussagen einzeln arbeiten, aber ich kann sie in einer einzigen Abfrage arbeiten nicht bekommen. Wie kann ich das machen? Wird es hilfreich sein, eine Unterabfrage zu verwenden?

+1

Sie‘ versuchen, eine Reihe von Tupeln zu machen - was in Ordnung ist. Jedes Tupel muss dieselbe "Dimensionalität" haben. Dies bedeutet, dass es diese Struktur "{([A], [B], [C] ...), ([A], [B], [C] ...), ([A], [ B], [C] ...) ...} 'wo A, B und C die gleichen Hierarchien sein müssen, _ in der gleichen Reihenfolge. – whytheq

Antwort

1

Versuchen Sie folgendes:

WITH 
    SET [Range] AS 
    { 
     [Effective Date].[Date].&[2015-12-01T00:00:00] 
    : [Effective Date].[Date].&[2015-12-31T00:00:00] 
    } 
SELECT 
NON EMPTY 
    { 
     ([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price]) 
    ,([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price]) 
    ,{nonempty([Range]*[Measures].[Money In])} 
    ,{nonempty([Range]*[Measures].[Money Out])} 
    } 
ON 0, 
NON EMPTY [Region Manager].[Full Name].[Full Name] ON 1 
FROM [Cube]; 

Aber NonEmpty nicht wirklich so erforderlich ist, ist dies prägnanter:

WITH 
    SET [Range] AS 
    { 
     [Effective Date].[Date].&[2015-12-01T00:00:00] 
    : [Effective Date].[Date].&[2015-12-31T00:00:00] 
    } 
SELECT 
NON EMPTY 
    { 
     ([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price]) 
    ,([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price]) 
    ,{[Range]*[Measures].[Money In]} 
    ,{[Range]*[Measures].[Money Out]} 
    } 
ON 0, 
NON EMPTY [Region Manager].[Full Name].[Full Name] ON 1 
FROM [Cube]; 

aggregieren Sie eine neue benutzerdefinierte Maßnahme benötigen:

WITH 
    SET [Range] AS 
    { 
     [Effective Date].[Date].&[2015-12-01T00:00:00] 
    : [Effective Date].[Date].&[2015-12-31T00:00:00] 
    } 
    MEMBER [Effective Date].[Date].[All].[AggRange] AS 
    Aggregate([Range]) 
SELECT 
NON EMPTY 
    { 
     ([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price]) 
    ,([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price]) 
    ,([Effective Date].[Date].[All].[AggRange],[Measures].[Money In]) 
    ,([Effective Date].[Date].[All].[AggRange],[Measures].[Money Out]) 
    } 
ON 0, 
NON EMPTY [Region Manager].[Full Name].[Full Name] ON 1 
FROM [Cube]; 
+0

Dies gibt separate Spalten für jedes Datum in [Money In] und [Money Out] zurück, aber ich brauche diese als Summensumme. – Gracie

+1

@Gracie ok - Ich habe diese zusätzliche Anforderung hinzugefügt. – whytheq

1

Wenn Sie nicht einen MDX-Dialekt verwenden, den ich noch nie gesehen habe, müssen Sie keine doppelten Klammern ({{....}}) verwenden.

Klammern bedeuten, dass der Inhalt ein Satz ist. Innerhalb von Klammern ist das Komma (,) ein UNION-Operator:

{Tom,Dick,Harry} 

gibt eine Gruppe von drei Personen.

Weil Sie verwenden Klammern hier:

non empty{{ 
    filter([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price]), 
    filter([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price]), 
    nonempty([Measures].[Money In], [Range]), 
    nonempty([Measures].[Money Out], [Range]) 
}} 

der Parser aus zwei Mitgliedern der Zeitpunkt des Inkrafttretens Dimension um einen Satz zu bilden, und zwei Mitglieder der Measure Dimension versucht. Dies ist unmöglich, weil sie unterschiedliche Dimensionen haben.

Es wäre schön gewesen, wenn der Parser Ihnen gesagt hatte, dass die

function 

es bezieht, ist die UNION (,) Funktion innerhalb einer festgelegten Definition. Das ist der MDX-Parser für Sie ...

Wenn Sie die zwei Kennzahlen und zwei Daten auf der gleichen Achse anzeigen möchten, definieren Sie die beiden Daten als berechnete Kennzahlen (MITGLIED Measures.Bla AS Head ([Range], 1), beispielsweise).

+0

Danke. Die Doppelstreben müssen von Ersatzmasken (zB {0}) für die Injektion von Parameterwerten unterschieden werden. Ich dachte, das wäre ungewöhnlich, aber kein Syntaxfehler? – Gracie

+0

Nein, doppelte Klammern verursachen keinen Syntaxfehler. Aber die Bedeutung von sogar einer einzelnen Klammer ist "das ist ein Satz". (Ich denke, doppelte Klammern würden bedeuten, "einen Satz aus diesem Satz zu machen", was harmlos ist). Außerdem können Sie nicht zwei Elemente der Dimension "Effektives Datum" sowie zwei Elemente der Dimension "Kennzahlen" festlegen. – SebTHU