обзор
Это сложная вещь, чтобы попросить PowerBI сделать, поэтому может быть трудно найти аккуратный подход.
Самая большая проблема заключается в том, что модель данных PowerBI не поддерживает концепцию промежуточного подсчета - по крайней мере, не так, как в Excel. В Excel столбец может ссылаться на значения, которые встречаются в «предыдущей строке» этого же столбца, а затем корректироваться с помощью некоторых «ежедневных изменений», перечисленных в другом столбце.
PowerBI может имитировать это только путем суммирования всех ежедневных изменений в некотором подмножестве строк. Мы берем значение даты в нашей текущей строке и создаем отфильтрованную таблицу, в которой все даты меньше даты текущей строки, а затем суммируем все ежедневные изменения из этого подмножества. Может показаться, что это небольшая разница, но она весьма значительна:
Это означает, что нет способа «переопределить» наш промежуточный итог. Единственная математика, которая выполняется, - это столбец, содержащий ежедневные изменения - столбец, содержащий «промежуточный итог», является только результатом - он никогда не используется в вычислениях последующих строк.
Мы должны отказаться от концепции «перезагрузки» и вместо этого представить себе создание столбца, который содержит значение «корректировки». Нашей корректировкой будет значение, которое может быть включено таким образом, чтобы при выполнении описанных условий сумма ежедневных остатков и корректировок составляла 1.
Если мы посмотрим на расчетный пробег, заданный OP, то увидим, что значение нашего промежуточного итога в «нерабочий» день непосредственно перед «рабочим» днем дает нам ту необходимую сумму, которая, если ее изменить, суммируется до нуля и вызвать увеличение промежуточного итога в каждый следующий рабочий день на единицу. Это наше желаемое поведение (с одной проблемой, которая будет описана позже).
Результат
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 работает, чтобы следовать этим вычислениям. В этом сценарии вы можете думать о «РАННЕЕ» как о значении «эта ссылка указывает на значение в текущей строке», а в противном случае ссылка указывает на всю таблицу, возвращаемую «ALLEXCEPT (Leave, Leave [Id])». В этом Кстати, мы находим места, где текущая строка имеет тип «Рабочая», а строка предыдущего дня имеет какой-то другой тип.
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])
))
Теперь, когда в каждой строке есть поле, объясняющее, куда идти, чтобы найти дневной баланс, чтобы использовать его в качестве нашей корректировки, мы можем просто посмотреть его в таблице.
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
И, наконец, мы применяем корректировку к нашему промежуточному итогу для конечного результата.
Проблема
При таком подходе не учитывается, что счетчик не должен сбрасываться, если текущий ежедневный баланс не станет меньше нуля. Раньше я ошибался, но я бы сказал, что этого нельзя достичь только в DAX, потому что это создает циклическую зависимость. По сути, вы предъявляете требование: используйте агрегированное значение, чтобы определить, что следует включить в агрегацию.
Так что это как далеко я могу принести вам. Надеюсь, поможет.