2010-04-16 8 views
5

Ich möchte eine berechnete Measure erstellen, die nur eine bestimmte Teilmenge von Datensätzen in meiner Faktentabelle basierend auf einem Dimensionsattribut zusammenfasst.Wie definiere ich ein berechnetes Measure in MDX basierend auf einem Dimensionsattribut?

Gegeben:

Dimension

  • Datum
  • LedgerLineItem {Gebühr, Zahlung, Ausbuchung, Copay, Kredit}

Maßnahmen

  • LedgerAmount

Beziehungen
* LedgerLineItem ist eine degenerierte Dimension von FactLedger

Wenn ich LedgerAmount von LedgerLineItem.Type brechen kann ich leicht erkennen, wie viel geladen ist, bezahlt, Kredit, usw., aber wenn ich dies nicht tun break it by LedgerLineItem.Type Ich kann nicht einfach das Guthaben, bezahlte, Kredit, etc. in eine Pivot-Tabelle hinzufügen. Ich möchte separate berechnete Kennzahlen erstellen, die nur bestimmte Typen (oder mehrere Typen) von Sachfakten zusammenfassen.

Ein Beispiel für die gewünschte Ausgabe wäre:

| Year | Charged | Total Paid | Amount - Ledger | 
| 2008 | $1000 | $600  | -$400   | 
| 2009 | $2000 | $1500  | -$500   | 
| Total | $3000 | $2100  | -$900   | 

ich versucht habe, die berechnete Kennzahl ein paar Möglichkeiten, und jeder arbeitet in einigen Fällen zu schaffen, aber nicht in anderen. Jetzt, bevor jemand dies in ETL sagt, habe ich es bereits in ETL getan und es funktioniert gut. Was ich versuche, MDX besser zu verstehen, ist herauszufinden, wie ich das, was ich in der ETL in MDX gemacht habe, duplizieren kann, da ich das bisher nicht kann.

Hier sind zwei Versuche, die ich gemacht habe und die Probleme mit ihnen. Dies funktioniert nur, wenn sich der Ledger-Typ in der Pivot-Tabelle befindet. Es gibt die richtige Menge der Sachposten (obwohl in diesem Fall ist es identisch mit [Menge - Buch], aber wenn ich versuche, Typ zu entfernen, und erhalten nur die Summe aller Ledger Einträge unbekannt, gibt

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment] 
AS CASE WHEN ([Ledger].[Type].currentMember = [Ledger].[Type].&[Credit]) 
OR ([Ledger].[Type].currentMember = [Ledger].[Type].&[Paid]) 
OR ([Ledger].[Type].currentMember = [Ledger].[Type].&[Held Money: Copay]) 
THEN [Measures].[Amount - ledger] 
ELSE 0 
END 
, FORMAT_STRING = "Currency" 
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger' ; 

. Dies funktioniert nur, wenn der Ledger-Typ nicht in der Pivot-Tabelle ist. Es gibt immer den gesamten Zahlungsbetrag zurück, was beim Aufteilen nach Typ falsch ist, da ich nur den Kreditanteil, den bezahlten Anteil, unterbezahlt sehen würde. $ 0 unter Ladung usw.

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment] 
AS sum({([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid]) 
, ([Ledger].[Type].&[Held Money: Copay])} 
, [Measures].[Amount - Ledger]) 
, FORMAT_STRING = "Currency" 
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger' ; 

gibt es eine Möglichkeit, dies die richtigen Zahlen zu machen Rückkehr unabhängig davon, ob Ledger.Type ist enthalten d in meiner Pivot-Tabelle oder nicht?

Antwort

7

Versuche vorhanden:

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment] 
AS sum(Existing({([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid]) 
, ([Ledger].[Type].&[Held Money: Copay])}) 
, [Measures].[Amount - Ledger]) 
, FORMAT_STRING = "Currency" 
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger' ; 

Sollte es die Aufmerksamkeit auf die Mitglieder im Spiel zahlen machen.

+0

Sie rocken! Das ist GENAU, wonach ich gesucht habe. –

0

Ich nehme an, dass die Ledger-Dimension einen Schlüssel im FactLedger hat, aber das Problem, dass es nicht mit dem ersten MDX-berechneten Element zusammenfasst, lässt mich glauben, dass Sie die Hierarchien dafür neu überdenken wollen.

Dann würde ein einfaches SUM basierend auf Ihrem Ledger-Typ funktionieren, macht das Sinn?

+0

einfache Aufsummierung basierend auf dem Ledger-Typ funktioniert, außer wenn ich will nicht in meiner Pivot-Tabelle Ledger-Typ zu berücksichtigen, was sehr häufig der Fall ist. Was ich versuche zu erreichen, ist die Gesamtzahl der verschiedenen Typen anzuzeigen, ohne die Typen als separate Entitäten in die Pivot-Tabelle aufnehmen zu müssen, sagen wir, wenn ich eine umfassendere Sicht auf mein Geschäft haben möchte, wie bezahlte, bezahlte und geleistete Stunden . Die Arbeitsstunden werden nicht nach Ledger-Typ aufgeschlüsselt, so dass man nach Ledger-Typ aufteilen muss, um die Gesamtkosten zu erhalten und zu bezahlen, ist in keinem Fall eine großartige Lösung, nur in spezifischen Ledger-Berichten. –

1

Kann nicht kommentieren Meff Antwort, also werde ich meine eigene schreiben.

Sie sollten mit Aggregate statt Summe betrachten, als Ergebnisse nicht immer die, die Sie Sum erwarten können unter Verwendung von:

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment] 
AS Aggregate(Existing({([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid]) 
, ([Ledger].[Type].&[Held Money: Copay])}) 
, [Measures].[Amount - Ledger]) 
, FORMAT_STRING = "Currency" 
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger' ; 
+1

AGGREGATE, wird standardmäßig das gleiche Ergebnis wie SUM zurückgeben. AGGREGATE ist SUM tatsächlich überlegen, weil damit auch andere Aggregationsfunktionen verwendet werden können. – SouravA