Überblick
Dies ist eine herausfordernde Aufgabe für PowerBI. Daher ist es möglicherweise schwierig, einen ordentlichen Ansatz zu finden.
Das größte Problem ist, dass das Datenmodell von PowerBI das Konzept einer laufenden Abrechnung nicht unterstützt - zumindest nicht so, wie wir es in Excel tun. In Excel kann eine Spalte auf Werte verweisen, die in der 'vorherigen Zeile' derselben Spalte vorkommen, und dann durch eine in einer anderen Spalte aufgeführte 'tägliche Änderung' angepasst werden.
PowerBI kann dies nur nachahmen, indem alle täglichen Änderungen über eine Teilmenge von Zeilen addiert werden. Wir nehmen den Datumswert in unserer aktuellen Zeile und erstellen eine gefilterte Tabelle, in der alle Daten kleiner als das Datum dieser aktuellen Zeile sind, und fassen dann alle täglichen Änderungen aus dieser Teilmenge zusammen. Dies scheint ein subtiler Unterschied zu sein, ist aber ziemlich bedeutsam:
Dies bedeutet, dass es keine Möglichkeit gibt, unsere laufende Summe zu überschreiben. Die einzige Berechnung, die durchgeführt wird, ist die Spalte mit den täglichen Änderungen - die Spalte mit der 'laufenden Summe' ist nur ein Ergebnis - sie wird niemals in der Berechnung einer nachfolgenden Zeile verwendet.
Wir müssen das Konzept des 'Zurücksetzens' aufgeben und uns stattdessen vorstellen, eine Spalte zu erstellen, die einen 'Anpassungs'-Wert enthält. Unsere Anpassung ist ein Wert, der einbezogen werden kann, sodass bei Erfüllung der beschriebenen Bedingungen die Summe der täglichen Salden und Anpassungen 1 ergibt.
Wenn wir uns den berechneten Lauf von OP ansehen, sehen wir, dass der Wert unserer laufenden Summe an einem "arbeitsfreien" Tag unmittelbar vor einem "arbeitenden" Tag den erforderlichen Betrag ergibt, der, wenn er umgekehrt wird, zu Null und Null summiert Die laufende Summe an jedem folgenden Arbeitstag erhöht sich um eins. Dies ist unser gewünschtes Verhalten (mit einem Problem, das später beschrieben wird).
Ergebnis
Most Recent Date Prior to Work =
CALCULATE(
Max(Leave[Date]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] = EARLIER(Leave[Date]) -1 && Leave[Type] <> "Working" && Earlier(Leave[Type]) = "Working"
))
Es ist hilfreich, den Unterschied zwischen Zeilen- und Filterkontexten zu kennen und zu wissen, wie EARLIER arbeitet, um dieser Berechnung zu folgen. In diesem Szenario können Sie sich "EARLIER" als "diese Referenz verweist auf den Wert in der aktuellen Zeile" vorstellen, und ansonsten verweist eine Referenz auf die gesamte Tabelle, die von "ALLEXCEPT (Leave, Leave [Id])" zurückgegeben wird Auf diese Weise finden wir die Stellen, an denen die aktuelle Zeile den Typ "Working" und die Zeile des Vortages einen anderen Typ hat.
Most Recent Date Prior to Work Complete =
CALCULATE(
Max(Leave[Most Recent Date Prior to Work]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] <= EARLIER(Leave[Date])
))
Diese Berechnung ahmt eine Art "Auffüllen" nach. Darin heißt es: "Wenn Sie alle Zeilen betrachten, deren Datum vor dem Datum in DIESER Zeile liegt, geben Sie den größten Wert in" Letztes Datum vor der Arbeit "zurück."
Daily Balance Adjustment =
CALCULATE(
SUM(Leave[Running Daily Balance]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] = EARLIER(Leave[Most Recent Date Prior to Work Complete])
))
Jetzt, da jede Zeile ein Feld enthält, in dem erklärt wird, wohin das tägliche Guthaben als Anpassung verwendet werden muss, können wir es einfach von der Tabelle aus nachschlagen.
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
Und schließlich wenden wir die Anpassung für das Endergebnis auf unsere laufende Summe an.
Die Angelegenheit
Bei diesem Ansatz wird nicht berücksichtigt, dass die Zählung nicht zurückgesetzt werden sollte, es sei denn, der laufende Tagesguthaben liegt unter Null. Ich habe mich zuvor als falsch erwiesen, aber ich würde sagen, dass dies nicht allein im DAX erreicht werden kann, da dadurch eine zirkuläre Abhängigkeit entsteht. Im Wesentlichen stellen Sie eine Anforderung: Verwenden Sie den aggregierten Wert, um zu bestimmen, was in der Aggregation enthalten sein soll.
So weit kann ich dich bringen. Ich hoffe es hilft.