Monday 27 February 2017

Powerpivot Moving Average Dax

SQL Server Denali PowerPivot Alberto Ferrari schrieb bereits über die Berechnung der gleitenden Durchschnittswerte im DAX mit einer berechneten Spalte. Ich möchte hier einen anderen Ansatz unter Verwendung einer berechneten Maßnahme vorstellen. Für den gleitenden Durchschnitt I8217m berechnen einen täglich gleitenden Durchschnitt (in den letzten 30 Tagen) hier. Für mein Beispiel, I8217m mit der PowerPivot-Arbeitsmappe, die als Teil der SSAS-Tabellarischen Model-Projekte aus den Denali CTP 3 Proben heruntergeladen werden können. In diesem Beitrag, I8217m Entwicklung der Formel Schritt für Schritt. Allerdings, wenn Sie in Eile sind, könnten Sie direkt auf die endgültigen Ergebnisse unten zu springen. In den Details sehen die Beispieldaten folgendermaßen aus: In jedem row8217s-Kontext gibt der Ausdruck DateDate den aktuellen Kontext an, dh das Datum für diese Zeile . Aber aus einer berechneten Maßnahme können wir nicht auf diesen Ausdruck verweisen (da es keine aktuelle Zeile für die Date-Tabelle gibt), stattdessen müssen wir einen Ausdruck wie LastDate (DateDate) verwenden. Also, um die letzten 30 Tage zu erhalten, können wir diesen Ausdruck verwenden Wir können jetzt unsere Internetverkäufe für jeden jener Tage zusammenfassen, indem wir die Zusammenfassungsfunktion verwenden: Zusammenfassen (160 DatesInPeriod (DateDate, LastDate (DateDate), - 30, DAY) 160, DateDate 160 quotSalesAmountSumquot 160 Sum (Internet SalesSales Amount)) Und schließlich we8217re die DAX-Funktion AverageX mit dem Mittelwert dieser 30 Werte zu berechnen: Verkaufsbetrag (30d avg): AverageX (160 Summarize (160.160.160 DatesInPeriod (DateDate, LastDate (DateDate), - 30, DAY) 160160160, Datumdatum 160160160. quotSalesAmountSumquot 160160160. Summe (Internet SalesSales Amount) 160, SalesAmountSum) Dies ist die Berechnung, die wir in unserer Internet Sales-Tabelle verwenden, wie im Screenshot unten gezeigt: Beim Hinzufügen dieser Berechnung zu der Pivot-Tabelle von oben sieht das Ergebnis folgendermaßen aus: Betrachtet man das Ergebnis, so scheint es, dass wir vor dem 1. Januar 2003 Daten haben: Der erste Wert für den gleitenden Durchschnitt ist identisch mit dem Tageswert Es gibt keine Zeilen vor diesem Datum). Der zweite Wert für den gleitenden Durchschnitt ist tatsächlich der Durchschnitt der ersten beiden Tage und so weiter. Dies ist nicht ganz richtig, aber I8217m immer wieder auf dieses Problem in einer Sekunde. Der Screenshot zeigt die Berechnung für den gleitenden Durchschnitt vom 31. Januar als Durchschnitt der täglichen Werte vom 2. bis 31. Januar. Unsere errechnete Maßnahme funktioniert auch, wenn Filter angewendet werden. Im folgenden Screenshot habe ich zwei Produktkategorien für die Datenreihe verwendet: Wie funktioniert unsere berechnete Messung auf höheren Aggregationsebenen Um herauszufinden, I8217m mit der Kalenderhierarchie auf die Zeilen (anstelle des Datums). Zur Vereinfachung habe ich die Semester - und Viertelniveaus mit Hilfe der Excel8217s-Pivot-Tabellenoptionen (Option ShowHide fields) entfernt. Wie Sie sehen können, funktioniert die Berechnung immer noch gut. Hier ist das monatliche Aggregat der gleitende Durchschnitt für den letzten Tag des jeweiligen Monats. Sie sehen das deutlich für Januar (Wert von 14.215.01 erscheint auch im Screenshot oben als Wert für den 31. Januar). Wenn dies die geschäftliche Anforderung (die vernünftig für einen Tagesdurchschnitt klingt), dann die Aggregation funktioniert auf einer monatlichen Ebene (sonst müssen wir Feinabstimmung unserer Berechnung und das wird ein Thema der kommenden Post sein). Aber obwohl die Aggregation auf monatlicher Ebene sinnvoll ist, wenn wir diese Sicht auf den Tagespegel erweitern, sehen wir, dass unsere berechnete Maßnahme einfach den Umsatzbetrag für diesen Tag, nicht den Durchschnitt der letzten 30 Tage, zurückgibt: Wie kann das sein? Das Problem ergibt sich aus dem Kontext, in dem wir unsere Summe berechnen, wie in dem folgenden Code hervorgehoben: Umsatzbetrag (30d durchschn.): AverageX (160 Summe (160160160 Terminsdatum, DateDate, LastDate, - 30, DAY) 160160160, DateDate 160160160. quotSalesAmountSumquot 160160160. Summe (Internet SalesSales Amount) 160) 160, SalesAmountSum) Da wir diesen Ausdruck über den angegebenen Zeitraum auswerten, ist der einzige Kontext, der hier überschrieben wird, DateDate. In unserer Hierarchie verwenden wir verschiedene Attribute aus unserer Dimension (Kalenderjahr, Monat und Tag des Monats). Da dieser Kontext noch vorhanden ist, wird die Berechnung auch durch diese Attribute gefiltert. Und dies erklärt, warum wir den aktuellen tag8217s Kontext immer noch für jede Zeile vorhanden ist. Um Dinge klar zu machen, solange wir diesen Ausdruck außerhalb eines Datumskontexts auswerten, ist alles in Ordnung, wie die folgende DAX-Abfrage bei der Ausführung von Management Studio im Internet Vertriebsperspektive unseres Modells (unter Verwendung der tabellarischen Datenbank mit denselben Daten) zeigt ): evaluate (160.160.160 Summarize (160160160160160160160 datesinperiod (DateDate, Datum (2003,1,1), - 5, DAY) 160160160160160160160, DateDate 160160160160160160160. quotSalesAmountSumquot 160160160160160160160. Sum (Internet SalesSales Betrag) 160160160)) Hier reduzierte ich die Zeitperiode Auf 5 Tage setzen und auch ein festes Datum festlegen, da LastDate (8230) das letzte Datum meiner Datendimensionstabelle ergeben würde, für die in den Beispieldaten keine Daten vorhanden sind. Hier ist das Ergebnis aus der Abfrage: Nach dem Setzen eines Filters auf 2003 werden jedoch keine Datenzeilen außerhalb von 2003 in die Summe aufgenommen. Das erklärt die oben stehende Bemerkung: Es sah so aus, als hätten wir erst ab dem 1. Januar 2003 Daten. Und jetzt wissen wir, warum: Das Jahr 2003 war auf dem Filter (wie man im ersten Screenshot dieses Beitrags sehen kann) und Daher war es bei der Berechnung der Summe vorhanden. Jetzt müssen wir nur noch diese zusätzlichen Filter loswerden, weil wir schon unsere Ergebnisse nach Datum filtern. Der einfachste Weg, dies zu tun, besteht darin, die Berechnungsfunktion zu verwenden und ALL (8230) für alle Attribute anzuwenden, für die wir den Filter entfernen möchten. Da wir einige dieser Attribute (Jahr, Monat, Tag, Wochentag, 8230) haben und wir den Filter von allen entfernen wollen, aber das Datumsattribut, ist die Verknüpfungsfunktion ALLEXCEPT hier sehr nützlich. Wenn Sie einen MDX-Hintergrund haben, werden Sie sich fragen, warum wir don8217t ein ähnliches Problem bei der Verwendung von SSAS im OLAP-Modus (BISM Multidimensional) erhalten. Der Grund ist, dass unsere OLAP-Datenbank Attributbeziehungen hat, also nach der Einstellung des Attributs date (key) werden die anderen Attribute automatisch auch geändert und wir müssen uns darum kümmern (siehe mein Beitrag hier). Aber im tabellarischen Modell haben wir Attributbeziehungen (nicht einmal ein echtes Schlüsselattribut) und deshalb müssen wir unerwünschte Filter aus unseren Berechnungen eliminieren. So, hier sind wir mit dem 8230 Verkaufsbetrag (30d avg): AverageX (160 Summarize (160.160.160 datesinperiod (DateDate, lastdate (DateDate), - 30, TAG) 160160160, DateDate 160160160. quotSalesAmountSumquot 160160160. berechnen (Sum (Internet SalesSales Betrag) , ALLEXCEPT (Date, DateDate) 160), SalesAmountSum) Und dies ist unsere letzte Pivot-Tabelle in Excel: Um den gleitenden Durchschnitt darzustellen, ist hier der gleiche Datenauszug in einer Diagrammansicht (Excel): Obwohl wir unsere Daten auf gefiltert haben 2003 berücksichtigt der gleitende Durchschnitt für die ersten 29 Tage des Jahres 2003 die entsprechenden Tage des Jahres 2002 korrekt. Sie werden die Werte für Januar 30 und 31 von unserem ersten Ansatz zu erkennen, da diese waren die ersten Tage, für die unsere erste Berechnung hatte eine ausreichende Menge an Daten (volle 30 Tage).SQL Server Denali PowerPivot Alberto Ferrari schrieb bereits über die Berechnung der gleitenden Durchschnitte in DAX über eine berechnete Spalte. Ich möchte hier einen anderen Ansatz vorstellen. Für den gleitenden Durchschnitt Im berechnen einen täglich gleitenden Durchschnitt (in den letzten 30 Tagen) hier. Für mein Beispiel Im Im Verwenden der PowerPivot-Arbeitsmappe, die als Teil der SSAS-Tabellarischen Modellprojekte aus den Denali CTP 3-Beispiel heruntergeladen werden kann. In diesem Beitrag, Im die Entwicklung der Formel Schritt für Schritt. Allerdings, wenn Sie in Eile sind, könnten Sie direkt auf die endgültigen Ergebnisse unten zu springen. Bei den Details sehen die Beispieldaten wie folgt aus: In jedem Zeilenkontext gibt der Ausdruck 8216DateDate den aktuellen Kontext an, dh das Datum für diese Zeile . Aber aus einer berechneten Maßnahme können wir nicht auf diesen Ausdruck verweisen (da es keine aktuelle Zeile für die Date-Tabelle gibt), stattdessen müssen wir einen Ausdruck wie LastDate (8216DateDate) verwenden. Also, um die letzten 30 Tage zu erhalten, können wir diesen Ausdruck verwenden Wir können jetzt unsere Internetverkäufe für jeden jener Tage zusammenfassen, indem wir die Zusammenfassungsfunktion verwenden: Zusammenfassen (DatesInPeriod (8216DateDate, LastDate (8216DateDate), - 30, DAY) .. 8217DateDate 8220SalesAmountSum8221 Sum (8216Internet SalesSales Amount)) Und schließlich wurden mit der Funktion DAX AverageX der Durchschnitt dieser 30 Werte zu berechnen: Verkaufsbetrag (30d avg): AverageX (Summarize (DatesInPeriod (8216DateDate, lastdate (8216DateDate), - Summe (8216Internet SalesSales Amount)), SalesAmountSum) Dies ist die Berechnung, die wir in unserer Internet Sales-Tabelle verwenden, wie im Screenshot unten gezeigt: Wenn Sie diese Berechnung der Pivot-Tabelle von oben hinzufügen, Das Ergebnis sieht folgendermaßen aus: Betrachtet man das Ergebnis, scheint es, dass wir keine Daten vor dem 1. Januar 2003 haben: Der erste Wert für den gleitenden Durchschnitt ist identisch mit dem Tageswert (es gibt keine Zeilen vor diesem Datum). Der zweite Wert für den gleitenden Durchschnitt ist tatsächlich der Durchschnitt der ersten beiden Tage und so weiter. Dies ist nicht ganz richtig, aber Im immer wieder auf dieses Problem in einer Sekunde. Der Screenshot zeigt die Berechnung für den gleitenden Durchschnitt vom 31. Januar als Durchschnitt der täglichen Werte vom 2. bis 31. Januar. Unsere errechnete Maßnahme funktioniert auch, wenn Filter angewendet werden. Im folgenden Screenshot habe ich zwei Produktkategorien für die Datenreihe verwendet: Wie funktioniert unsere berechnete Messung auf höheren Aggregationsebenen, um herauszufinden, wie ich die Kalenderhierarchie in den Zeilen (anstelle des Datums) verwende. Zur Vereinfachung entfernte ich die Semester - und Viertelstufen mit Excels-Pivot-Tabellenoptionen (Option ShowHide fields). Wie Sie sehen können, funktioniert die Berechnung immer noch gut. Hier ist das monatliche Aggregat der gleitende Durchschnitt für den letzten Tag des jeweiligen Monats. Sie sehen das deutlich für Januar (Wert von 14.215.01 erscheint auch im Screenshot oben als Wert für den 31. Januar). Wenn dies die Geschäftsanforderung (die vernünftig für einen täglichen Durchschnitt klingt), dann die Aggregation funktioniert auf monatlicher Ebene (sonst müssen wir Feinabstimmung unserer Berechnung und das wird ein Thema der kommenden Post sein). Aber obwohl die Aggregation auf einer monatlichen Ebene sinnvoll ist, wenn wir diese Ansicht auf den Tagespegel erweitern, sehen wir, dass unsere berechnete Maßnahme einfach die Umsatzmenge für diesen Tag zurückgibt, nicht den Durchschnitt der letzten 30 Tage mehr: Wie kann das sein. Das Problem ergibt sich aus dem Kontext, in dem wir unsere Summe zu berechnen, wie im folgenden Code hervorgehoben: Verkaufsbetrag (30d avg): AverageX (Summarize (datesinperiod (8216DateDate, lastdate (8216DateDate), - 30, TAG), 8217DateDate 8220SalesAmountSum8221.. Summe (8216Internet SalesSales Amount)), SalesAmountSum) Da wir diesen Ausdruck über den angegebenen Zeitraum auswerten, ist der einzige Kontext, der hier überschrieben wird, 8216DateDate. In unserer Hierarchie wurden verschiedene Attribute aus unserer Dimension (Kalenderjahr, Monat und Tag des Monats) verwendet. Da dieser Kontext noch vorhanden ist, wird die Berechnung auch durch diese Attribute gefiltert. Und das erklärt, warum wir den aktuellen Tag Kontext ist immer noch für jede Zeile. Um die Dinge klar zu machen, solange wir diesen Ausdruck außerhalb eines Datumskontexts auswerten, ist alles in Ordnung, wie die folgende DAX-Abfrage bei der Ausführung von Management Studio im Internet Vertriebsperspektive unseres Modells (unter Verwendung der tabellarischen Datenbank mit denselben Daten) zeigt ): evaluate (Summarize (datesinperiod (8216DateDate, Datum (2003,1,1), - 5, TAG), 8217DateDate 8220SalesAmountSum8221 Sum (8216Internet SalesSales Betrag)..)) Hier habe ich die Zeitdauer bis 5 Tage verkürzt und auch eingestellt Ein festes Datum als LastDate () würde das letzte Datum meiner Datendimensionstabelle ergeben, für die in den Beispieldaten keine Daten vorhanden sind. Hier ist das Ergebnis aus der Abfrage: Nach dem Setzen eines Filters auf 2003 werden jedoch keine Datenzeilen außerhalb von 2003 in die Summe aufgenommen. Das erklärt die oben stehende Bemerkung: Es sah so aus, als hätten wir erst ab dem 1. Januar 2003 Daten. Und jetzt wissen wir, warum: Das Jahr 2003 war auf dem Filter (wie man im ersten Screenshot dieses Beitrags sehen kann) und Daher war es bei der Berechnung der Summe vorhanden. Jetzt müssen wir nur noch diese zusätzlichen Filter loswerden, weil unsere Ergebnisse bereits nach Datum gefiltert wurden. Der einfachste Weg, dies zu tun, besteht darin, die Berechnungsfunktion zu verwenden und ALL () für alle Attribute anzuwenden, für die wir den Filter entfernen möchten. Da wir einige dieser Attribute (Jahr, Monat, Tag, Wochentag) haben und wir den Filter von allen entfernen wollen, aber das Datumsattribut, ist die Verknüpfungsfunktion ALLEXCEPT hier sehr nützlich. Wenn Sie einen MDX-Hintergrund haben, werden Sie sich fragen, warum wir nicht ein ähnliches Problem bei der Verwendung von SSAS im OLAP-Modus (BISM Multidimensional). Der Grund ist, dass unsere OLAP-Datenbank Attributbeziehungen hat, also nach dem Setzen des Datums (Schlüssel) Attribut, die anderen Attribute werden automatisch auch geändert und wir müssen nicht darauf achten (siehe meine Post hier). Aber im tabellarischen Modell haben wir keine Attributbeziehungen (nicht einmal ein echtes Schlüsselattribut) und deshalb müssen wir unerwünschte Filter aus unseren Berechnungen eliminieren. Hier sind wir also mit dem Betrag Sales (30d avg): AverageX (Summarize (datesinperiod (8216DateDate, lastdate (8216DateDate), - 30, TAG), 8217DateDate 8220SalesAmountSum8221 berechnen (Sum (8216Internet SalesSales Amount), ALLEXCEPT (8216Date8217,8217DateDate.. ))), SalesAmountSum) Und dies ist unsere letzte Pivot-Tabelle in Excel: Zur Veranschaulichung der gleitenden Durchschnitt, hier ist der gleiche Datenauszug in einer Diagrammansicht (Excel): Obwohl wir unsere Daten im Jahr 2003 gefiltert die gleitende Durchschnitt für die erste 29 Tage von 2003 korrekt berücksichtigt die entsprechenden Tage des Jahres 2002 zu berücksichtigen. Sie werden die Werte für den 30. Und 31. Januar aus unserem ersten Ansatz erkennen, da dies die ersten Tage waren, für die unsere erste Berechnung eine ausreichende Datenmenge (volle 30 Tage) hatte (in der Regel das Datum in einer Datumstabelle) Zweck des Teilens Baustein dieser Formel, hielt ich es auf diese Weise es einfach) Formel zu halten (berechnete Kennzahl): Code language8221text8221 Moving Average Letzte 3 Tage: Errechnen (MITTELWERT (TableNameAmt), DATESINPERIOD (TableNamedate, PREVIOUSDAY (TableNamedate), - 3, day)) code Ergebnisse über eine Pivot-Tabelle: Beachten Sie, dass die Formel ein Baustein ist und Sie nach Ihren Anforderungs - und Datenmodellen Änderungen vornehmen müssen. Fühlen Sie sich frei, einen Kommentar zu hinterlassen, wenn Sie Hilfe von meiner Seite benötigen. Und auch die Nutzung der PowerPivot-Forum zu erreichen, um Gemeinschaft: MSDN Forum 8211 PowerPivot für Excel Share this: Folgendes: Navigation Navigation Was denken Sie, Hinterlasse einen Kommentar unten. Abbrechen Antwort Sehr geehrte Paras Doshi, ich kämpfe mit diesen bewegten Durchschnitten seit geraumer Zeit mit vielen verschiedenen Arten von Pendeltischen. Meine Daten können beispielsweise so aussehen, meine ursprüngliche Tabelle heißt 8220MonthlySummaryTAB8221: YearMonthTypeVolume Datum 2015 1 A 1000 1.1.2015 2015 1 B 2000 1.1.2015 2015 2 A 2000 1.2.2015 2015 2 B 4000 1.2.2015 2015 3 A 3000 2015.02.01 2015 3 B 6000 2015.01.02, wo die Datumsspalte aus Monat und Tabelle durch aufgebaut ist: FORMAT (Jahr amp 82.208.221 amp FORMAT (INT (Monat) 822108221) 8221yyyymm8221) natürlich sind die Daten komplexer als hier ist aber der Grund Idee bleibt, dass ich volumerische Daten für jeden Monat nach Produkttyp haben. Ich möchte einen gleitenden Durchschnitt von 3 vorherigen Monaten berechnen und möchte die Daten in Pivot-Tabellen für jeden Typ anzeigen, zum Beispiel für A-Typ: YearMonthVolumeVolume AVG 2015 1 1000 1000 2015 2 2000 1500 2015 3 3000 2000 Ich habe es anders ausprobiert Berechneten Felder, um dies zu tun, aber keiner von ihnen haben gearbeitet. Meine letzten Versuch ist: Moving Average Die letzten 3 Monate: Errechnen (MITTELWERT (MonthlySummaryTABVolume) DATESINPERIOD (MonthlySummaryTABDate DATEADD (MonthlySummaryTABDate-3 Monate) 3 Monat)) Können Sie mir mit diesem Problem helfen


No comments:

Post a Comment