Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

In diesem Tutorial werfen wir einen Blick auf einen Teil des DAX-Codes. Möglicherweise haben Sie so etwas bereits verwendet. Oder Sie stoßen darauf und sind verwirrt darüber, wie dieser Code funktioniert und wie Zeilenkontext und Filterkontext in nur einem einzigen DAX-Code miteinander zu interagieren scheinen. Wie dem auch sei, in diesem Tutorial werden alle oben genannten Punkte im Detail behandelt. Das vollständige Video dieses Tutorials können Sie unten in diesem Blog ansehen.

Zuerst schauen wir uns den Code selbst an. Anschließend gehen wir den theoretischen Teil durch, um ihn besser zu verstehen. Abschließend werfen wir mithilfe von DAX Studio einen Blick hinter die Kulissen .

Das Datenmodell, das wir verwenden werden, ist im Grunde ein einfaches Verkaufsdatenmodell, das Termine, Verkäufe und die Produkttabelle enthält. Die Verkaufstabelle enthält Transaktionen für jeden bestimmten Tag. Die Tabelle „Produkte“ enthält Informationen zu den Verkaufsinformationen der Produkte an jedem bestimmten Tag. Für die Zwecke dieses Tutorials enthält die Datumstabelle nur wenige Spalten.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Uns interessiert nur die Tabelle „Dates“, aber wir werden die Tabelle „Sales“ und die Tabelle „Products“ verwenden, um zu erklären, wie sich der Filterkontext und der Zeilenkontext mithilfe von Beziehungen verbreiten.

Inhaltsverzeichnis

Zeilenkontext und Filterkontext in einer laufenden Gesamtkennzahl

Erstellen wir nun eine laufende Summenkennzahl, da diese sowohl Zeilen- als auch Filterkontexte enthält. Dies ist ein grundlegendes Maß für die laufende Gesamtsumme, bei dem ich COUNTROWS über dem FILTER und die ALL-Funktion verwende, um alle Jahre zurückzugeben, die ich in der Datumstabelle habe. Wenn ich diese Kennzahl in die Tabelle unten einfüge, können Sie sehen, dass wir das erwartete Ergebnis erhalten.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Versuchen wir nun zu analysieren, wie dieser DAX-Code funktioniert.

In der Kennzahl sehen Sie zunächst, dass wir COUNTROWS haben, aber das ist nicht die erste Funktion, die ausgewertet oder ausgeführt wird. Dann haben wir die Funktion FILTER und dann die Funktion ALL. Das erste in der Bewertungsreihenfolge ist ALLES. ALL gibt alle eindeutigen Werte der Datums-Kalender-Jahreszahl zurück, indem alle Filterkontexte ignoriert werden, die außerhalb der ALL-Funktion vorhanden sind.

In den Metriken haben wir also die Spalte „Kalenderjahrnummer“, und diese Spalte wird aktiv gefiltert. Da jedoch ALL den vorhandenen Filterkontext ignoriert, erhalten wir alle eindeutigen Werte dieser Spalte.

Im zweiten Argument im Zeilenkontext haben wir geschrieben, dass die Jahreszahl des Dates-Kalenders kleiner sein sollte als die Zahl des Kalenderjahres von MAX Dates. Wenn Sie nun ein Anfänger sind und immer noch versuchen, DAX zu verstehen und zu lernen, denken Sie vielleicht, dass sowohl die Referenzen auf der linken Seite als auch innerhalb der MAX-Funktion zur selben Spalte gehören und dieselbe Tabelle sind, die wir in der haben ALLE Funktion.

Aber das stimmt nicht. Der einzige Teil des Zeilenkontexts, der zur ALL-Funktion gehört, ist der, den wir auf der linken Seite haben. Das, was wir auf dem MAX haben, wird innerhalb eines Filterkontexts und nicht im Zeilenkontext ausgewertet.

FILTER versucht also, einen Zeilenkontext für die Tabelle zu erstellen, die Sie im ersten Argument angeben, und dieser Teil des Codes wird tatsächlich aus diesem bestimmten Zeilenkontext abgerufen. FILTER iteriert also in jeder Zeile die Tabelle, die wir in ALL haben, und dann können wir auf alle Werte zugreifen, die wir gerade iterieren.

In der ersten Iteration haben wir also nur einen Wert. In der zweiten Iteration haben wir den zweiten Wert. Aber wenn wir MAX schreiben, ist es unabhängig vom Zeilenkontext, den wir mit der FILTER-Funktion erstellen. MAX wird also im Filterkontext ausgewertet, der durch die aktuelle Jahreszahl erstellt wird, die wir in dieser Matrix verwendet haben.

Wenn wir bei 2006 sind, gibt MAX 2006 zurück, während die aktuelle Zeile 2006, 2007 oder 2008 sein kann. FILTER wird die Tabelle zurückgeben, die die Kriterien erfüllt, die wir im zweiten Argument angeben. Wenn wir zu 2007 wechseln, wird MAX 2007 zurückgeben. Im Jahr 2008 wird es 2008 zurückgeben. Und abhängig von allen Werten, die kleiner sind als der von der MAX-Funktion zurückgegebene Wert, wird FILTER a zurückgeben Tisch.

Um zu beweisen, dass MAX nicht vom Zeilenkontext abhängt, können wir diesen Teil des DAX-Codes in mehrere Variablen aufteilen. Und dann können wir verstehen, dass die Spaltenreferenzen auf der linken und rechten Seite nicht identisch sind.

Erstellen wir also eine Variable.

Wie Sie in der Kennzahl unten sehen können, habe ich drei Variablen ( ) erstellt. Anschließend habe ich den FILTER-Code zuletzt mit einer Variablen Result hinzugefügt, die COUNTROWS verwendet . Wenn ich diese Kennzahl in der folgenden Tabelle verwende, werden Sie feststellen, dass sich nichts ändert. Die Ergebnisse sind immer noch die gleichen. Wir erhalten immer noch die gleiche Gesamtsumme wie zuvor.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Wenn wir zum Code zurückkehren und versuchen, den Wert der ersten Variablen abzurufen und dies zu bestätigen, sehen Sie, dass wir für jede Zeile das gleiche Jahr erhalten.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Hoffentlich konnte ich Ihnen also erklären, dass die MAX-Funktion in diesem speziellen Code nicht wirklich vom tatsächlichen Kontext für ihre Werte abhängt. Und wenn Sie Ihr Verständnis des Auswertungskontexts vereinfachen möchten, können Sie den Code jederzeit in mehrere Variablen aufteilen, damit Sie die Auswertungsreihenfolge und die Ausführung des Codes nachvollziehen können.

Jetzt möchte ich Ihnen ein Szenario zeigen , in dem die MAX-Funktion vom Zeilenkontext abhängt , der von der FILTER-Funktion erstellt wird.

Kehren wir also zu dieser Maßnahme zurück. Lassen Sie uns das duplizieren, und anstelle von „Letztes sichtbares Jahr“ habe ich „ MAX. Daten Kalenderjahrnummer“. Wenn ich das in die Matrix einfüge, sehen Sie, dass wir eine Leerstelle erhalten.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Warum?

Die Sache ist, dass wir all die Jahre iterieren und CALCULATE die aktuell iterierte Zeile in einen äquivalenten Filterkontext konvertiert.

Wenn ich hier ein Gleichheitszeichen schreibe, sehen Sie, dass wir sieben, sieben und sieben erhalten.

Warum?

Lassen Sie mich eine neue berechnete Tabelle erstellen, damit Sie leicht verstehen können, was passiert.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Ich werde eine neue Tabelle erstellen. Als Nächstes schreibe ich über die Kalenderjahrnummer „ALL Dates“. Dann schreibe ich „Max. Jahr“ und verwende dann CALCULATE über dem MAX der Datums-Kalenderjahrnummer. Und jetzt können Sie sehen, dass wir für jede Zeile denselben Wert wiederholen.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Da diese Zahlen nicht unbedingt kleiner als sie selbst sind, erhalten wir ein Leerzeichen. Wenn wir jedoch gleich (=) verwenden, sagen wir, dass alle Werte, die kleiner als 2011 sind, eine Sieben erhalten.

Darüber hinaus funktioniert dieser Code nicht, selbst wenn Sie eine Maßreferenz wie etwa „Max Year“ verwenden.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Wenn ich auf „Bestätigen“ klicke, sehen Sie, dass wir immer noch nichts erhalten. Das liegt daran, dass wir, wenn wir „Max Year“ schreiben, einfach „CALCULATE MAX Dates Calendar Year Number“ schreiben.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Eine Maßreferenz enthält immer ein CALCULATE außerhalb davon. Diese Maßnahme initiiert also einen Kontextübergang, der die aktuell iterierte Zeile in einen Filterkontext umwandelt.

Wenn Sie jedoch gebunden sind und eine Kennzahlreferenz verwenden müssen, können Sie diese Kennzahl in einer Variablen speichern. Und wie Sie vielleicht wissen, sind Variablen konstant und können keinen Kontextübergang erzeugen. Daher kann der Zeilenkontext nicht in einen Filterkontext umgewandelt werden.

Das ist also eine kurze Demonstration, wie ein Zeilenkontext und ein Filterkontext in einem DAX-Code miteinander interagieren.

Gehen wir nun zu DAX Studio, um zu verstehen, was sich hinter den Kulissen abspielt.

Verwenden von DAX Studio zum Verstehen des Zeilenkontexts und des Filterkontexts

Gehen wir zu den externen Tools und starten Sie DAX Studio. Wir müssen mithilfe des Abfrageplans und der Server-Timings eine Verbindung zur LuckyTemplates-Datei herstellen .

Dann werde ich eine Abfragekennzahl erstellen. Ich schreibe DEFINE MEASURE in die Datumstabelle, Dates Running Total. Und dann werde ich den ursprünglichen Code verwenden, den wir hatten.

Da wir eine Tabelle zurückgeben sollen, können wir EVALUATE schreiben. Zum Schluss erstellen wir die Tabelle mit SUMMARIZECOLUMNS. Wir schreiben also die Datumsangaben, die Jahreszahl des Kalenders und die virtuelle Spalte, die die laufende Summe darstellt. Und dann kann ich so etwas wie DT als DAX Studio-Schlüsselwort schreiben.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Wenn ich diesen Code ausführe, können Sie sehen, dass der Code vollständig ist und wir immer noch das gleiche Ergebnis erhalten, das wir in LuckyTemplates gesehen haben.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Gehen wir nun zum Abfrageplan, um zu verstehen, was sich hinter den Kulissen abspielt. Mal sehen, ob die MAX-Funktion tatsächlich vom Zeilenkontext abhängig ist oder nicht. Gehen wir zum logischen Abfrageplan über, da der physische Abfrageplan im Allgemeinen komplexer und etwas schwieriger zu lesen ist.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Sie können sehen, dass der erste Operator in der ersten Zeile GroupSemiJoin ist und von SUMMARIZECOLUMNS verwendet wird, um eine innere Verbindung zwischen zwei Spalten zu erstellen.

Zum Verbinden dieser Spalten gibt es dann Scan_Vertipaq , die Speicher-Engine, die wir in den Analysediensten haben. Wir können sehen, dass dort steht, dass wir eine Spalte benötigen, nämlich Datumsangaben, Kalenderjahresnummer. In LuckyTemplates können Sie sehen, dass wir in der Matrix diese Spalte „Kalenderjahrnummer“ haben, die als Zugriff auf unseren Bericht dient.

Als nächstes haben wir die COUNTROWS-Funktion in unserer Messung als Operator der obersten Ebene, dann ruft COUNTROWS die FILTER-Funktion für den Filter auf. Es gibt wieder einen Scan_Vertipaq , der besagt, dass RequiredCols die Jahreszahl des Datumskalenders ist.

Die Zeilen 2 und 5 sind gleich, aber der erste Scan_Vertipaq ist mit Null markiert, während der zweite mit Eins gekennzeichnet ist. Das bedeutet, dass die Spalte, auf die wir mit Hilfe der ALL-Funktion zugreifen, separat von der Spalte extrahiert wird, die wir in der SUMMARIZECOLUMNS-Funktion haben.

Dann gibt es einen LessThan- Operator. In der nächsten Zeile sehen wir, dass es einen Vergleich zwischen dem Zeilenkontext und der MAX-Funktion gibt .

Darauf folgt der Max_Vertipaq . Wir extrahieren also tatsächlich den Max-Wert aus der Speicher-Engine. Auf der rechten Seite sehen Sie, dass dort „DependOnCols Dates Calendar Year Number“ steht. Das ist das Wichtigste, woran wir uns erinnern müssen. Vorhin habe ich gesagt, dass es keine Abhängigkeit der MAX-Funktion vom Zeilenkontext gibt, und das ist es, was es tatsächlich beweist.

Und so steht hier Null.

Wo haben wir Null gefunden?

Oben (die zweite Zeile), die für SUMMARIZECOLUMNS extrahiert wird. Das bedeutet, dass die MAX-Funktion nicht vom Zeilenkontext abhängt, sondern tatsächlich von der Spalte (Kalenderjahrnummer), die wir in dieser Tabelle haben. Diese Tabelle erstellt also tatsächlich den Filterkontext.

Kurz gesagt, die MAX-Funktion ist vom Filterkontext und nicht vom Zeilenkontext abhängig.

Als Nächstes können Sie sehen, dass wir für die Berechnung von Max_Vertipaq einen Scan_Vertipaq haben , der besagt, dass DependOnCols null (0) Datum, Kalender, Jahreszahl ist. Und dann gibt es noch mehrere andere Spalten, die Spalten erfordern.

Schauen wir uns nun die variable Version des Codes an. Anstatt LastVisibleYear zurückzugeben, werde ich die COUNTROWS-Version oder die Ergebnisvariable zurückgeben, und Sie können sehen, dass wir immer noch das gleiche Ergebnis erhalten.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Wenn wir uns den Abfrageplan ansehen, sehen Sie, dass er etwas länger ist, aber viel einfacher zu lesen.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Abschließend finden Sie hier auch die berechnete Version des Codes

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code

Und so sieht sein logischer Abfrageplan aus.

Zeilenkontext und Filterkontext in einem LuckyTemplates DAX-Code


DAX LuckyTemplates: Was ist Zeilenkontext?
Einführung in den Filterkontext in LuckyTemplates.
Was ist Kontextübergang und warum ist er wichtig?

Abschluss

In diesem Tutorial habe ich erklärt, wie eine bestimmte Funktion mit dem Zeilenkontext interagieren kann und nicht. Ich habe Ihnen auch gezeigt, wie der MAX in diesem Fall im Filterkontext und nicht im Zeilenkontext ausgewertet wurde.

Es ist wichtig, immer daran zu denken, dass der Filterkontext das gesamte Modell filtert und der Zeilenkontext nur die angegebene Tabelle iteriert und niemals das Modell filtert. Der Filterkontext iteriert keine Tabelle.

Ich hoffe, Sie fanden dieses Tutorial hilfreich. Seien Sie gespannt auf unseren DAX Studio- Code, den wir in Kürze veröffentlichen werden. Wir werden viel tiefer auf ähnliche Szenarien eingehen. Außerdem zeigen wir Ihnen, wie Sie Ihren DAX-Code optimieren können.

Leave a Comment

Streudiagramm-Visualisierungen mit Charticulator

Streudiagramm-Visualisierungen mit Charticulator

In diesem Tutorial erfahren Sie, wie Sie mit Charticulator eine Streudiagramm-Visualisierung für Ihren LuckyTemplates-Bericht erstellen und entwerfen.

PowerApps-Suchfeld: So fügen Sie es hinzu und passen es an

PowerApps-Suchfeld: So fügen Sie es hinzu und passen es an

Erfahren Sie, wie Sie ein PowerApps-Suchfeld von Grund auf erstellen und es an das Gesamtthema Ihrer App anpassen.

Power Automate String-Funktionen: Substring und IndexOf

Power Automate String-Funktionen: Substring und IndexOf

Erlernen Sie ganz einfach zwei komplizierte Power Automate String-Funktionen, die in Microsoft Flows verwendet werden können – die Funktionen substring und indexOf.

Power Query M: Abwechselndes 0-1-Muster in der Datumstabelle

Power Query M: Abwechselndes 0-1-Muster in der Datumstabelle

Dieses Tutorial konzentriert sich auf die Power Query M-Funktion „number.mod“, um ein abwechselndes 0-1-Muster in der Datumstabelle zu erstellen.

Prognosetechnik: Erkundung der Prognoselogik in LuckyTemplates-Modellen

Prognosetechnik: Erkundung der Prognoselogik in LuckyTemplates-Modellen

In diesem Tutorial führe ich eine Prognosetechnik durch, bei der ich meine tatsächlichen Ergebnisse mit meinen Prognosen vergleiche und sie kumulativ betrachte.

Speichern Sie E-Mail-Anhänge in SharePoint mit Power Automate

Speichern Sie E-Mail-Anhänge in SharePoint mit Power Automate

In diesem Blog erfahren Sie, wie Sie mit Power Automate E-Mail-Anhänge automatisch in SharePoint speichern und E-Mails anschließend löschen.

Führen Sie eine Bis-Loop-Steuerung in Power Automate durch

Führen Sie eine Bis-Loop-Steuerung in Power Automate durch

Erfahren Sie, wie die Do Until Schleifensteuerung in Power Automate funktioniert und welche Schritte zur Implementierung erforderlich sind.

Berechnen eines gleitenden Durchschnitts in LuckyTemplates mithilfe von DAX

Berechnen eines gleitenden Durchschnitts in LuckyTemplates mithilfe von DAX

In diesem Tutorial erfahren Sie, wie Sie mithilfe der ALLSELECTED-Funktion einen dynamischen gleitenden Durchschnitt in LuckyTemplates berechnen können.

Berechnen Sie dynamisch eine laufende oder kumulative LuckyTemplates-Summe

Berechnen Sie dynamisch eine laufende oder kumulative LuckyTemplates-Summe

Durch diesen Artikel erhalten wir ein klares und besseres Verständnis für die dynamische Berechnung einer laufenden oder kumulativen Gesamtsumme in LuckyTemplates.

Power Automate auf jede Aktion in Workflows anwenden

Power Automate auf jede Aktion in Workflows anwenden

Erfahren und verstehen Sie die Bedeutung und ordnungsgemäße Verwendung der Power Automate-Aktionssteuerung „Auf jede anwenden“ in unseren Microsoft-Workflows.