2017-01-30 3 views
0

Ich habe eine Fact-Tabelle mit Bestellpositionen und der entsprechenden Bestellnummer. Es hat ungefähr 250 Millionen Reihen.Selbstfiltertabelle mit DAX im Tabellenmodell sehr langsam

Mein Ziel ist es, eine Kennzahl zu erstellen, mit der die folgende Frage beantwortet werden kann: Wie hoch ist der Gesamtumsatz aller Bestellungen, die das Produkt xyz enthalten?

Ich habe eine Tabelle mit allen eindeutigen Artikelnummern, genannt Orderfilter, mit nur einer Spalte OrderFilter [ArticleNr] hinzugefügt. Diese Tabelle soll verwendet werden, um die Auftragstabelle zu filtern. Diese Tabelle ist nicht mit der Auftragstabelle verknüpft.

Basierend auf dieser Einstellung habe ich folgendes Maß erstellt.

Diese Berechnung an sich scheint zu funktionieren, aber es ist sehr langsam. Wenn ich versuche, es in Excel zu verwenden, indem ich Hierarchien in die Zeilen setze, wird das Zeitlimit überschritten.

Gibt es eine Möglichkeit, diese Abfrage zu optimieren?

Grüße, Henning Lange

Update: Gewünschtes Ergebnis Tables (wirklich nicht wissen, wie Tabellen hier hinzufügen ...)

Die Orders-Tabelle. Wenn ich nach ArtikelNr = 2 filtere, möchte ich die "< - Keep" - Zeilen behalten.

|OrderNr  |ArticleNr |  
|1   |1   | <- Keep  
|1   |***2*** | <- Keep  
|2   |1   |  
|2   |3   |  
|3   |***2*** | <- Keep 
+1

Warum erstellen Sie nicht die Beziehung zwischen den beiden Tabellen? es wäre leistungsfähiger als die Verwendung ** CONTAINS ** Funktion in einem ** FILTER **. Explizite Beziehungen sind immer schneller als Filter. –

+0

Hallo, danke für die schnelle Antwort. Ich denke, eine Beziehung würde mir bei diesem Problem nicht helfen. Wenn ich eine Beziehung zwischen diesen Tabellen erstelle, würde ich auf Orders [ArticleNr] zu Orderfilter [ArticleNr] beziehen. Auf diese Weise würde ich die Tabelle Orders basierend auf ArtikelNr filtern. Aber das möchte ich nicht erreichen. Ich möchte die Orders-Tabelle basierend auf OrderNr filtern. "Was sind die Verkäufe aller Bestellungen mit Artikeln x, y oder z?" Mit Ihrem Vorschlag könnte ich die Frage "Was sind die Verkäufe der Artikel x, y oder z?" Beantworten. Oder irre ich mich in dieser Annahme? –

+0

Ich würde es an der Quelle behandeln, d. H. Eine gemeinsame Spalte in den Orders und den Orderfilter-Tabellen erstellen. Bearbeiten Sie Ihre Frage, um Beispieldaten und erwartete Ergebnisse einzubeziehen. –

Antwort

0

Dieser Ansatz funktioniert nur, wenn Sie eine ArticleNr auswählen. Da ich MAX() Funktion verwende, um zu bestimmen, was der ausgewählte Wert in dem Filter ist, wird das Maximum immer ArticleNr immer ArticleNr zurückgegeben.

Betrachten Sie diese Beispieldaten:

Orders Tabelle

OrderNr ArticleNr Revenue 
    1   1  100 
    1   2  200 
    2   1   50 
    2   3   70 
    3   2  300 
    3   4  200 
    4   1   50 

Artikel

ArticleNr 
    1 
    2 
    3 

eine Maßnahme Erstellen Sie die Zeilen bestimmen:

Rows := 
SUMX (FILTER (Orders, [ArticleNr] = MAX (Articles[ArticleNr])), 1) 

nun mit dem Rows messen Sie die Sum Sales bekommen:

Sum Sales := 
SUMX (
    FILTER (Orders, SUMX (ALLEXCEPT (Orders, Orders[OrderNr]), [Rows]) = 1), 
    [Revenue] 
) 

Dies ist eine Pivot-Tabelle in der Power Pivot.

enter image description here

Lassen Sie mich wissen, ob das hilft.

+0

Hallo, das funktioniert super! Ich bin erstaunt, wie viel Mühe Sie in diese Frage investiert haben. Am Ende war ich nicht sehr glücklich mit der Möglichkeit, nur einen Artikel zu filtern. Ich habe hier eine andere Lösung gefunden, die mit mehreren ArticleNrs funktioniert: http://blog.gbrueckl.at/2012/05/resolving-many-to-many-relationshereering-dax-cross-table-filtering/ –

0

Wenn es nur langsam ist, wenn Sie Hierarchien in Excel verwenden, dann sind die Hierarchien das Problem. Wahrscheinlich ist es unnatürlich. Excel sendet MDX-Abfragen an SSAS, egal welche Engine verwendet wird (Tabular/Multidim). Und wenn es zu unnatürlichen Hierarchien kommt, läuft alles schief.

Versuchen Sie, natürliche Hierarchie aufzubauen und es dann zu überprüfen. Nehmen Sie Date Dim als Beispiel. Sie haben Datum, Monat, Jahr. Wenn Sie einfach Januar - Dezember in die Spalte Monat einfügen, ist das nicht eindeutig. Versuchen Sie explizit, Hierarchy-Mitglieder anzugeben. Wie in diesem Fall, setze auch das Jahr in die Monatsspalte, wie Januar - 2016 usw. Daher wird jeder Monat einzigartig sein, und die Engine wird nicht entscheiden, welches Mitglied du nehmen sollst, wenn du Drill-Downs machst.