ภาพรวม
นี่เป็นสิ่งที่ท้าทายที่จะให้ 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 ดำเนินการเพื่อติดตามการคำนวณนี้ ในสถานการณ์สมมตินี้คุณสามารถคิดว่า "EARLIER" เป็นความหมาย 'จุดอ้างอิงนี้ไปยังค่าในแถวปัจจุบัน "และมิฉะนั้นเป็นจุดอ้างอิงไปยังตารางทั้งหมดที่ส่งกลับโดย" ALLEXCEPT (ปล่อย, ปล่อย [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 เพียงอย่างเดียวเพราะมันสร้างการพึ่งพาแบบวงกลม โดยพื้นฐานแล้วคุณต้องมีข้อกำหนด: ใช้ค่าที่สรุปรวมเพื่อกำหนดว่าควรรวมสิ่งใดในการรวม
ดังนั้นเท่าที่ฉันสามารถนำคุณ หวังว่ามันจะช่วย