2009-11-20 13 views
5

sagen, dass ich ein gewisses Maß haben, haben foo, in einem Würfel, und ich eine Meldepflicht, die Benutzern die folgenden Maßnahmen in einem Bericht sehen möchten:eine Maßnahme Filterung (oder Ausreißer Entfernen)

total foo 
total foo excluding instances where foo > 10 
total foo excluding instances where foo > 30 

Was ist der beste Weg, damit umzugehen? In der Vergangenheit habe ich Named Berechnungen hinzugefügt, die NULL wenn foo > 10 oder nur foo andernfalls zurückgeben. Ich fühle mich wie es eine Möglichkeit zu sein, hat dies in MDX (so etwas wie Filter([Measures].[foo], [Measures].[foo] > 10)) zu erreichen, aber ich kann nicht für das Leben von mir nichts herausfinden.

Irgendwelche Ideen?

Antwort

3

Der Trick, dass Sie ist Sie müssen den Filter auf Ihr Gerät und nicht auf Ihr Gerät anwenden

Mit dem üblichen Demo-Cube "Warehouse and Sales" von Microsoft wird beispielsweise das folgende MDX die Verkäufe für alle Geschäfte anzeigen, in denen der Umsatz über $ 2000 lag .

 
SELECT Filter([Store].[Stores].[Store].members, [Unit Sales] > 2000) ON COLUMNS, 
[Unit Sales] ON ROWS 
FROM [Warehouse and Sales] 
+1

ich Ihre Eingabe zu schätzen wissen, ist, dass nicht alle gewünschten E Ich gehe nach. Ihr Beispiel filtert eine Reihe von Stores, aber was ich suche, ist eine Möglichkeit, Faktendatensätze zu filtern. Sagen Sie in Ihrem Beispiel, dass ich den durchschnittlichen Einheitenumsatz pro Geschäft anzeigen möchte, aber ich möchte immer noch jeden Store anzeigen, aber der Durchschnitt soll keine Einheitenverkäufe> 2000 ergeben. – Colin

2

Ich glaube, Sie haben zwei Möglichkeiten:

1- Spalte zu Ihrer Tatsache (oder Ansicht auf Datenquellensicht, die auf Faktentabelle basiert) hinzufügen:

case when unit_Price>2000 then 1 
    else 0 
end as Unit_Price_Uper_Or_Under_10 

und fügen Sie eine fiktive Dimension auf dieser Basis Spaltenwert und fügen Sie benannte Abfrage für New Dimension (sagen Range_Dimension in Datasourceview: 1 wählen als Bereich Vereinigung all 0 als Bereich wählen

und nach taht Sie diese Filter wie andere Dimension und Attribut kippen

SELECT [Store].[Stores].[Store].members ON COLUMNS, 
[Unit Sales] ON ROWS 
FROM [Warehouse and Sales] 
WHERE [Test_Dimension].[Range].&[1] 
.

das Problem ist, für jeden Bereich Sie When Bedingung hinzufügen müssen und nur dann, wenn der Bereich diese Lösung statisch ist eine gute Lösung ist. und für Dynamikbereich ist es besser, den Bereich (basierend auf disceretizing Methode)

012 zu formulieren

2- hinzuzufügen Dimension mit Granularität in der Nähe von Faktentabelle auf Faktentabelle beispielsweise auf Basis, ob wir Faktentabelle mit Primärschlüssel haben Sale_id .we Dimension mit nur einer Spalte basierend auf Faktentabelle hinzufügen kann und in sale_Iddimension Usage tab wir können dies beziehen new dimension und measure group mit Beziehungstyp Fact und danach in mdx wir so etwas wie verwenden:

filter([dim Sale].[Sale Id].[Sale Id].members,[Measures].[Unit Price]>2000) 
0

ich traf ähnliches Problem bei der Verwendung Saiku (Backend mit Mondrain), da ich keine klaren Lösung "gefunden Filter auf Takt hinzufügen ", ich habe es hier hinzugefügt, und das kann für andere Leute nützlich sein.

In Saiku3.8 könnten Sie Filter auf UI hinzufügen: "Spalte" -> "Filter" -> "Benutzerdefiniert", dann können Sie einen Filter MDX Ausdruck sehen.

Nehmen wir an, wir Klicks in Ad wollen mehr als 1000, dann gibt die folgende Zeile hinzufügen:

[Measures].[clicks] > 1000 

Speichern und schließen, dann ist das Filter für find Elem mit Klicks mehr als 1000.

gültig

der MDX mag unter (nehme dt als Dimension und Klicks als Maß, wir dt mit Klicks finden wollen mehr als 1000)

WITH 
SET [~ROWS] AS 
    Filter({[Dt].[dt].[dt].Members}, ([Measures].[clicks] > 1000)) 
SELECT 
NON EMPTY {[Measures].[clicks]} ON COLUMNS, 
NON EMPTY [~ROWS] ON ROWS 
FROM [OfflineData]