概観
これはPowerBIに依頼するのが難しいことなので、整然としたアプローチを見つけるのは難しいかもしれません。
最大の問題は、PowerBIのデータモデルが、実行中の集計の概念をサポートしていないことです。少なくとも、Excelで行う方法はそうではありません。Excelでは、列は同じ列の「前の行」にある値を参照し、別の列にリストされている「毎日の変更」によって調整できます。
PowerBIは、行の一部のサブセットで毎日のすべての変更を合計することによってのみこれを模倣できます。現在の行の日付値を取得し、すべての日付がこの現在の行の日付よりも小さいフィルター処理されたテーブルを作成してから、そのサブセットからのすべての毎日の変更を合計します。これは微妙な違いに思えるかもしれませんが、非常に重要です。
つまり、現在の合計を「上書き」する方法はありません。行われている唯一の計算は、毎日の変更を含む列で行われます。「積算合計」を含む列は結果にすぎません。後続の行の計算では決して使用されません。
「リセット」の概念を放棄し、代わりに「調整」値を含む列を作成することを想像する必要があります。私たちの調整は、記載された条件が満たされたときに、1日の残高と調整の合計が1になるように含めることができる値になります。
OPによって計算されたランニングを見ると、「稼働」日の直前の「非稼働」日のランニング合計の値は、逆にした場合、合計がゼロになり、翌営業日の累計を1つ増やします。これが望ましい動作です(後で説明する1つの問題があります)。
結果
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"
))
行とフィルターのコンテキストの違いと、EARLIERがこの計算に従うためにどのように動作するかを知るのに役立ちます。このシナリオでは、「EARLIER」は「この参照が現在の行の値を指す」という意味であると考えることができます。それ以外の場合、参照は「ALLEXCEPT(Leave、Leave [Id])」によって返されるテーブル全体を指します。つまり、現在の行のタイプが「Working」であり、前日の行のタイプが他のタイプである場所を見つけます。
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])
))
この計算は、「塗りつぶし」のような操作を模倣しています。「この行の日付より前の日付を持つすべての行を見ると、「作業前の最新の日付」で最大の値を返します。
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])
))
これで、すべての行に、調整として使用する1日の残高を探す場所を説明するフィールドができたので、テーブルからそれを調べることができます。
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
最後に、最終結果の現在の合計に調整を適用します。
問題
このアプローチでは、実行中の1日の残高がゼロを下回らない限り、カウントがリセットされないようにする必要があります。私は以前に間違っていることが証明されましたが、循環依存関係を作成するため、これはDAXだけでは達成できないと言えます。基本的に、要件を作成します。集約された値を使用して、集約に何を含めるかを決定します。
それで、私はあなたを連れて行くことができます。それが役に立てば幸い。