Tổng quat
Đây là một điều khó khăn để yêu cầu PowerBI làm, vì vậy cách tiếp cận gọn gàng có thể khó tìm.
Vấn đề lớn nhất là mô hình dữ liệu của PowerBI không hỗ trợ khái niệm kiểm đếm hoạt động - ít nhất không phải là cách chúng tôi làm trong Excel. Trong Excel, một cột có thể tham chiếu các giá trị xảy ra trong 'hàng trước' của cùng cột đó và sau đó được điều chỉnh bởi một số 'thay đổi hàng ngày' được liệt kê trong một cột khác.
PowerBI chỉ có thể bắt chước điều này bằng cách thêm tất cả các thay đổi hàng ngày qua một số tập hợp con của các hàng. Chúng tôi lấy giá trị ngày trong hàng hiện tại của chúng tôi và tạo một bảng được lọc trong đó tất cả các ngày nhỏ hơn ngày của hàng hiện tại này và sau đó tổng hợp tất cả các thay đổi hàng ngày từ tập hợp con đó. Điều này có vẻ là một sự khác biệt tinh tế, nhưng nó khá quan trọng:
Điều này có nghĩa là không có cách nào để 'ghi đè' tổng số hoạt động của chúng tôi. Phép toán duy nhất đang được thực hiện là xảy ra trên cột chứa các thay đổi hàng ngày - cột chứa 'tổng chạy' chỉ là kết quả - nó không bao giờ được sử dụng trong bất kỳ phép tính nào của hàng tiếp theo.
Chúng ta phải từ bỏ khái niệm 'đặt lại' và thay vào đó hãy tưởng tượng tạo một cột chứa giá trị 'điều chỉnh'. Điều chỉnh của chúng tôi sẽ là một giá trị có thể được bao gồm để khi các điều kiện được mô tả được đáp ứng, tổng số dư và điều chỉnh hàng ngày sẽ tổng bằng 1.
Nếu chúng ta nhìn vào hoạt động được tính toán do OP đưa ra, chúng ta sẽ thấy rằng giá trị của tổng số hoạt động của chúng ta vào một ngày 'không làm việc' ngay trước một ngày 'làm việc' mang lại cho chúng ta số tiền cần thiết, nếu đảo ngược, sẽ bằng 0 và làm cho tổng số chạy vào mỗi ngày làm việc tiếp theo tăng thêm một. Đây là hành vi mong muốn của chúng tôi (với một vấn đề sẽ được mô tả sau này).
Kết quả
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"
))
Nó giúp biết được sự khác biệt giữa bối cảnh hàng và bộ lọc và cách EARLIER vận hành để thực hiện theo tính toán này. Trong kịch bản này, bạn có thể nghĩ "EARLIER" có nghĩa là 'tham chiếu này trỏ đến giá trị trong hàng hiện tại "và nếu không thì một tham chiếu đến toàn bộ bảng được trả về bởi" ALLEXCEPT (Rời khỏi, để lại [Id]). " cách này, chúng tôi tìm thấy những nơi mà hàng hiện tại có loại "Hoạt động" và hàng của ngày trước có một số loại khác.
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])
))
Tính toán này bắt chước một loại hoạt động 'điền xuống'. Nó nói, "Khi nhìn vào tất cả các hàng có ngày trước ngày trên hàng NÀY, hãy trả về giá trị lớn nhất trong 'Ngày gần đây nhất trước khi làm việc."
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])
))
Bây giờ mỗi hàng có một trường giải thích nơi cần tìm số dư hàng ngày để sử dụng làm điều chỉnh của chúng tôi, chúng tôi có thể chỉ cần tìm nó từ bảng.
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
Và cuối cùng chúng tôi áp dụng điều chỉnh cho tổng số chạy của chúng tôi cho kết quả cuối cùng.
Vấn đề
Cách tiếp cận này không giải quyết được rằng không nên thiết lập lại trừ khi số dư hàng ngày đang chạy dưới 0. Tôi đã được chứng minh là sai trước đây, nhưng tôi sẽ nói rằng điều này không thể được thực hiện trong DAX một mình vì nó tạo ra sự phụ thuộc vòng tròn. Về cơ bản, bạn đưa ra một yêu cầu: sử dụng giá trị tổng hợp để xác định những gì cần được đưa vào tổng hợp.
Vì vậy, đó là xa tôi có thể mang lại cho bạn. Hy vọng nó giúp.