Power BI Desktop DAX รีสตาร์ทคอลัมน์รวมทั้งหมด


9

ฉันมีตารางที่ทุกคนมีบันทึกสำหรับทุกวันของปี ฉันใช้ฟังก์ชั่นนี้เพื่อให้ได้ผลรวมการดำเนินงานตามคอลัมน์ยอดดุลรายวัน

CALCULATE(
SUM(Leave[Daily Balance]),
FILTER(
   ALLEXCEPT(Leave, Leave[Employee Id]),
   Leave[Date] <= EARLIER(Leave[Date])
))

แต่ฉันต้องการผลรวมสะสมเพื่อเริ่มต้นใหม่จาก 1 ถ้า Type = Working และผลรวมการทำงานของ Daily Balance น้อยกว่าศูนย์และประเภทของแถวก่อนหน้านี้ไม่เท่ากับ Working ด้านล่างนี้เป็นภาพหน้าจอจาก Excel คอลัมน์ฟังก์ชั่นที่ต้องการคือสิ่งที่ฉันต้องไป

ป้อนคำอธิบายรูปภาพที่นี่


1
ในแถวของวันที่ 5 พฤศจิกายนบุคคลที่ 1 สมมติว่าข้อมูลการทดสอบของเรามีรูปแบบที่ว่างเปล่า 'ฟังก์ชั่นที่จำเป็น' จะคืนค่าเป็น 1 หรือ 2 ในวันที่ 6 พฤศจิกายนหรือไม่
Ryan B.

มันจะคืนค่า 2 สำหรับ 6 พฤศจิกายนการ "รีเซ็ต" จะไม่เกิดขึ้นเพราะ 5 พฤศจิกายนจะเป็น 1 (ไม่ใช่ตัวเลขติดลบ) ขอบคุณสำหรับการโพสต์รายละเอียดของคุณ ฉันกำลังรีวิววันนี้
LynseyC

คำตอบ:


1

นี่ไม่เพียงเป็นผลรวมการรันที่มีเงื่อนไขเท่านั้น แต่ยังรวมถึงการซ้อน / คลัสเตอร์เนื่องจากมีการใช้ตรรกะในระดับ ID สำหรับตารางขนาดใหญ่ M นั้นดีกว่า DAX เนื่องจากไม่ได้ใช้ RAM มากนัก (ฉัน blogged เกี่ยวกับที่นี่: ลิงก์ไปยัง Blogpost

ฟังก์ชั่นต่อไปนี้ปรับตรรกะให้เหมาะกับกรณีปัจจุบันและจะต้องใช้กับระดับ ID: (ชื่อคอลัมน์ที่จำเป็นคือ: "Type", "Daily Allowance", "Adjustments")

(MyTable as table) => let SelectJustWhatsNeeded = Table.SelectColumns(MyTable,{"Type", "Daily Allowance", "Adjustments"}), ReplaceNulls = Table.ReplaceValue(SelectJustWhatsNeeded,null,0,Replacer.ReplaceValue,{"Adjustments"}), #"Merged Columns" = Table.CombineColumns(ReplaceNulls,{"Daily Allowance", "Adjustments"}, List.Sum,"Amount"), TransformToList = List.Buffer(Table.ToRecords(#"Merged Columns")), ConditionalRunningTotal = List.Skip(List.Generate( () => [Type = TransformToList{0}[Type], Result = 0, Counter = 0], each [Counter] <= List.Count(TransformToList), each [ Result = if TransformToList{[Counter]}[Type] = "working" and [Result] < 0 and [Type] <> "working" then TransformToList{[Counter]}[Amount] else TransformToList{[Counter]}[Amount] + [Result] , Type = TransformToList{[Counter]}[Type], Counter = [Counter] + 1 ], each [Result] )), Custom1 = Table.FromColumns( Table.ToColumns(MyTable) & {ConditionalRunningTotal}, Table.ColumnNames(MyTable) & {"Result"} ) in Custom1


สิ่งนี้ได้แก้ไขปัญหา ทำงานได้อย่างสมบูรณ์แบบและไม่ได้ทำให้รายงานช้าลง ขอบคุณ
LynseyC

5

ภาพรวม

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

ดังนั้นเท่าที่ฉันสามารถนำคุณ หวังว่ามันจะช่วย


1
เกี่ยวกับประเด็นสุดท้ายของคุณฉันเชื่อว่าคุณถูกต้อง DAX ไม่สามารถเรียกซ้ำได้
Alexis Olson

3

หวังว่าในครั้งต่อไปคุณจะวาง csv หรือรหัสที่สร้างข้อมูลตัวอย่างแทนภาพ :)

ฉันขอแนะนำให้คุณทำการคำนวณใน PowerQuery แทน ฉันพยายามแยกโค้ดสำหรับขั้นตอนสองสามขั้นเพื่อปรับปรุงความสามารถในการอ่าน สิ่งนี้อาจดูซับซ้อนกว่านี้เล็กน้อย แต่ใช้งานได้ดี เพียงวางในเครื่องมือแก้ไขขั้นสูงจากนั้นแทนที่แหล่งข้อมูลด้วยข้อมูลต้นฉบับของคุณ ขอให้โชคดี!

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjDUMzDSMzIwtFTSUQpILSrOz1MwBDLL84uyM/PSlWJ1gGqMsKuBSBrjkzQhwnRTItSYEaHGHJ9DLPBJWhI23dAAjwGGOAIRIokj9OCmxwIA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [date = _t, name = _t, #"type" = _t]),
    SetTypes = Table.TransformColumnTypes(Source,{{"date", type date}, {"name", type text}, {"type", type text}}),
    TempColumn1 = Table.AddColumn(SetTypes, "LastOtherType", (row)=>List.Max(Table.SelectRows(SetTypes, each ([name] = row[name] and [type] <> row[type] and [date] <= row[date]))[date], row[date]), type date) //Here for each row we select all rows of other type with earlier date, and take max that date. Thus we know when was previous change from one type to another
 //Here for each row we select all rows of other type with earlier date, and take max that date. Thus we know when was previous change from one type to another
,
    TempColumn2 = Table.AddColumn(TempColumn1, "Count", (row)=>
(if row[type]="working" then 1 else -1) * 
Table.RowCount(
Table.SelectRows(SetTypes, each ([name] = row[name] and [type] = row[type] and [date] <= row[date] and [date] > row[LastOtherType])) /* select all rows between type change (see prev step) and current row */
), /*and count them*/
Int64.Type) // finally multiply -1 if they are not working type
,
    FinalColumn = Table.AddColumn(TempColumn2, "FinalFormula", (row)=> 
(if row[type] = "working" then row[Count] else /* for working days use Count, for others take prev max Count and add current Count, which is negative for non-working*/
Table.LastN(Table.SelectRows(TempColumn2, each [name] = row[name] and [type] = "working" and [LastOtherType] <= row[LastOtherType]),1)[Count]{0}
+ row[Count])
, Int64.Type),
    RemovedTempColumns = Table.RemoveColumns(FinalColumn,{"LastOtherType", "Count"})
in
    RemovedTempColumns

ฉันไม่แน่ใจว่าสิ่งนี้ครอบคลุมทุกสถานการณ์ แต่ดูเหมือนว่าแนวทางที่ถูกต้อง
Mike Honey

ฉันสามารถใช้งานได้ก็ต่อเมื่อประเภทแรกสำหรับแต่ละคนกำลังทำงาน เช่นเดียวกับตัวอย่าง DAX มันจะรีสตาร์ทการกำหนดหมายเลขสำหรับขบวนการทำงานเมื่อยอดรวมสะสมสำหรับแถวก่อนหน้าเป็นจำนวนบวก ฉันเดาภาพของฉันทำให้เข้าใจผิดเพราะมันมีเพียงสถานการณ์นี้ ฉันควรรวมเวลาที่ประเภทเปลี่ยนเป็นทำงาน แต่ผลรวมแถวก่อนหน้านั้นเป็นค่าบวก
LynseyC

@LynseyC ดีรหัสนี้ไม่ได้เป็นโซลูชั่นที่สมบูรณ์แบบและแน่นอน แต่ตัวอย่างของวิธีการที่อาจใช้ เพียงแก้ไขหากสถานการณ์ของคุณ
ยูจีน

@LynseyC ซึ่งเป็นหนึ่งในข้อได้เปรียบในการทำคณิตศาสตร์นี้ใน PowerQuery แทนที่จะเป็น DAX เป็นวิธีที่ง่ายในการเก็บคอลัมน์ temp ออกจากแบบจำลองข้อมูล
ยูจีน

3

ฉันคิดว่าฉันมีมัน!

นี่คือผลลัพธ์ที่สร้างตามวิธีที่ฉันโพสต์ไว้ก่อนหน้านี้: (ข้อมูลได้รับการแก้ไขเพื่อแสดงพฤติกรรม "ไม่ทำงาน / ไม่ทำงาน" และใช้เคส)

ผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่

รายละเอียด

(1) ปล่อย Colums "ปรับยอดคงเหลือรายวันที่ปรับแล้ว" และ "ปรับยอดดุลรายวัน" เราจะได้ผลลัพธ์เดียวกันด้วยขั้นตอนที่น้อยลงเพียงไม่กี่นาที

(2) สร้างคอลัมน์ต่อไปนี้ (RDB = "กำลังเรียกใช้ยอดคงเหลือรายวัน") ...

Grouped RDB = 

CALCULATE(
SUM(Leave[Daily Balance]),
FILTER(
   ALLEXCEPT(Leave, Leave[Id], Leave[Most Recent Date Prior to Work Complete]),
   Leave[Date] <= EARLIER(Leave[Date]) 
))

หลังจากที่ได้สร้าง "วันที่ล่าสุดก่อนที่จะทำงานให้เสร็จสมบูรณ์" เรามีชิ้นส่วนที่จำเป็นในการ 'รีเซ็ต' ของเราที่ฉันอ้างว่าเป็นไปไม่ได้มาก่อน โดยการกรองในฟิลด์นี้เรามีโอกาสเริ่มแต่ละชิ้นที่ '1'

(3) เรายังคงมีปัญหาเดิมอยู่เราไม่สามารถดูผลลัพธ์ในคอลัมน์ของเราและใช้เพื่อตัดสินใจว่าจะทำอะไรต่อในคอลัมน์เดียวกันนั้น แต่เราสามารถสร้างคอลัมน์ปรับใหม่ที่จะเก็บข้อมูลนั้นไว้! และเรามีการอ้างอิงถึง 'วันที่ล่าสุดก่อนที่จะทำงาน' - นั่นคือวันสุดท้ายในกลุ่มก่อนหน้านี้ ... แถวที่มีข้อมูลที่เราต้องการ!

Grouped RDB Adjustment = 

VAR CalculatedAdjustment =
CALCULATE(
SUM(Leave[Grouped RDB]),
FILTER(
   ALLEXCEPT(Leave, Leave[Id]),
   Leave[Date] IN SELECTCOLUMNS(
        FILTER(
            Leave,
            Leave[Most Recent Date Prior to Work] <> BLANK() &&
            Leave[id] = EARLIER(Leave[Id])), "MRDPtW", Leave[Most Recent Date Prior to Work]) &&
   Leave[Most Recent Date Prior to Work Complete] < EARLIER(Leave[Most Recent Date Prior to Work Complete]) &&
   Leave[Most Recent Date Prior to Work Complete] <> Blank()
))

RETURN if (CalculatedAdjustment > 0, CalculatedAdjustment, 0)

ดังนั้นเราจะดูวันสุดท้ายในแต่ละกลุ่มก่อนหน้านี้และถ้าผลรวมทั้งหมดของการปรับเหล่านั้นมีค่าเป็นบวกเราจะใช้มันและถ้ามันเป็นค่าลบเราจะปล่อยให้มันอยู่คนเดียวแทน นอกจากนี้หากไม่กี่วันแรกของบุคคลเราเป็นวันที่ไม่ทำงานเราไม่ต้องการให้บิตลบเริ่มต้นในการปรับของเราเลยดังนั้นมันจึงถูกกรองออกไปด้วย

(4) ขั้นตอนสุดท้ายนี้จะนำการปรับไปสู่ผลลัพธ์สุดท้าย สรุปสองคอลัมน์ใหม่และในที่สุดเราก็ควรจะมียอดดุลคงเหลือประจำวันที่ปรับแล้ว Voila!

Adjusted Running Daily Balance = Leave[Grouped RDB] + Leave[Grouped RDB Adjustment]

เราสร้างคอลัมน์พิเศษขึ้นมามากมายตามทางจนถึงผลลัพธ์นี้ซึ่งโดยปกติแล้วฉันไม่ชอบทำอะไร แต่นี่เป็นสิ่งที่ยุ่งยาก


สวัสดี @ Ryan B. มันทำงานได้อย่างสมบูรณ์แบบสำหรับคนมากกว่า 200 คนในองค์กรของฉัน แต่ก็ไม่ได้ผล ฉันพยายามเปลี่ยนรหัสด้วยตัวเอง แต่ไม่สามารถแก้ไขอะไรได้ ฉันคิดว่าเป็นเพราะพวกเขาทำงานมาเป็นเวลานานและจากนั้นก็ทำงานเพียงหนึ่งวันก่อนที่จะหยุดทำงาน ฉันเชื่อมโยงกับภาพเพื่อแสดงปัญหา ขอบคุณ รูปภาพ
LynseyC

ฉันได้ปรับเปลี่ยนการวัด "การปรับ RDB ที่จัดกลุ่ม" เพื่อให้ผ่านการรับรู้จำนวนมากของการลาข้ามวัฏจักร "ทำงาน / ไม่มีงาน" หลายครั้ง
Ryan B.

2
สวัสดีขอบคุณสำหรับความพยายามทั้งหมดชื่นชมมาก น่าเสียดายที่การแก้ไขไม่สามารถแก้ไขปัญหาได้ อย่างไรก็ตามถ้าฉันลบเงื่อนไขสุดท้ายในตัวกรอง "ปล่อยให้ [วันล่าสุดก่อนที่จะทำงานให้เสร็จสิ้น] <> ว่างเปล่า ()" มันแก้ปัญหาได้ แต่แล้วมันก็ทำให้
Calcs

ยิง. ฉันหวังว่าคุณจะพบสิ่งที่ใช้ได้
Ryan B.

2

ใช้เวลาสักครู่ แต่ฉันสามารถแก้ปัญหาได้ สมมติว่าค่ายอดคงเหลือสำหรับช่องว่างอยู่เสมอ -1 และค่าเป็น 1 สำหรับ "ทำงาน" และข้อมูลนั้นพร้อมใช้งานสำหรับวันที่ทั้งหมดโดยไม่มีช่องว่างบางอย่างเช่นการคำนวณด้านล่างสามารถทำงานได้:

Running Total = 
    VAR Employee = Leave[Employee ID]
    VAR Date1 = Leave[Date]
    VAR Prev_Blank = CALCULATE(MAX(Leave[Date]),
                        FILTER(Leave,Leave[Date] < Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]=BLANK()))  
    VAR Day_count_Working = CALCULATE(COUNT(Leave[Date]),
                        FILTER(Leave,Leave[Date] > Prev_Blank),
                        FILTER(Leave,Leave[Date] <= Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]="Working")) 
    VAR Day_count = CALCULATE(COUNT(Leave[Date]),
                        FILTER(Leave,Leave[Date] >= Prev_Blank),
                        FILTER(Leave,Leave[Date] <= Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee)) 
RETURN (IF(Day_count_Working=BLANK(),Day_count,Day_count-1)-Day_count_Working)*-1 + Day_count_Working

โปรดจำไว้ว่านี่อาจไม่ใช่ผลิตภัณฑ์ที่เสร็จสมบูรณ์เพราะฉันทำงานกับกลุ่มตัวอย่างขนาดเล็ก แต่สิ่งนี้ควรช่วยคุณในการเริ่มต้น หวังว่านี่จะช่วยได้


ขอบคุณ @ CR7SMS มันจะรีสตาร์ทผลรวมที่รันอยู่เมื่อ type = Working แต่ผลรวมการรันเมื่อชนิดนั้นว่างเปล่าไม่ทำงาน สำหรับ 7 พฤศจิกายนจะลดลงเหลือ 3 แต่จากนั้น 8-14 พ.ย. จะคืนค่า -2 คุณสามารถช่วยแก้ไขรหัสเพื่อให้ผลรวมสะสมทำงานเมื่อประเภทว่างเปล่าหรือไม่ ขอบคุณ
LynseyC

สวัสดี Lynsey ฉันลองคำนวณต่างกัน ฉันได้เพิ่มมันเป็นคำตอบอื่นเนื่องจากการคำนวณนั้นค่อนข้างยาว แต่หวังว่าการคำนวณใหม่จะได้ผล
CR7SMS

@ CR7SMS โปรดหลีกเลี่ยงการเพิ่มคำตอบมากกว่าหนึ่งคำถาม มันสร้างความสับสนให้ผู้ใช้รายอื่นที่อาจค้นหาปัญหา / วิธีแก้ไขปัญหาที่คล้ายคลึงกันและไม่ดี แต่คุณควรเพิ่มสิ่งที่คุณอาจคิดออกมาเป็นคำตอบเดียวและแยกส่วนต่าง ๆ ออกเป็นส่วน ๆ
Christos Lytras

2

การคำนวณมีความยาวเล็กน้อย แต่ดูเหมือนว่าจะทำงานในข้อมูลตัวอย่างที่ฉันใช้ ลองดูสิ:

Running Total = 
    VAR Employee = Leave[Employee ID]
    VAR Date1 = Leave[Date]
    VAR Prev_Blank = CALCULATE(MAX(Leave[Date]),
                        FILTER(Leave,Leave[Date] < Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]=BLANK()))  
    VAR Prev_Working = CALCULATE(MAX(Leave[Date]),
                        FILTER(Leave,Leave[Date] < Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]="Working"))    
    VAR Prev_Blank1 = CALCULATE(MAX(Leave[Date]),
                        FILTER(Leave,Leave[Date] < Prev_Working),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]=BLANK()))  
    VAR Prev_type = CALCULATE(MAX(Leave[Type]),
                        FILTER(Leave,Leave[Date] = Date1-1),
                        FILTER(Leave,Leave[Employee ID]=Employee))
    VAR Prev_Blank2 = IF(Leave[Type]="Working" && (Prev_Blank1=BLANK() || Prev_type=BLANK()),Date1-1,Prev_Blank1)    
    VAR Day_count_Working = CALCULATE(COUNT(Leave[Date]),
                        FILTER(Leave,Leave[Date] > Prev_Blank2),
                        FILTER(Leave,Leave[Date] <= Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]="Working")) 
    VAR Day_count = CALCULATE(COUNT(Leave[Date]),
                        FILTER(Leave,Leave[Date] >= Prev_Blank2),
                        FILTER(Leave,Leave[Date] <= Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee)) 
RETURN (IF(Day_count_Working=BLANK(),Day_count,Day_count-1)-Day_count_Working)*-1 + Day_count_Working

ฉันใช้ตัวแปรมากมายที่นี่ คุณอาจจะได้รุ่นที่สั้นกว่านี้ โดยพื้นฐานแล้วแนวคิดคือการค้นหาสิ่งที่เกิดขึ้นครั้งแรกก่อนหน้านี้ของ "การทำงาน" เพื่อค้นหาตำแหน่งที่จะเริ่มการคำนวณ สิ่งนี้คำนวณในตัวแปร "Prev_Blank2" เมื่อเราทราบจุดเริ่มต้น (เริ่มต้นด้วย 1 ที่นี่) จากนั้นเราสามารถนับจำนวนวันด้วย "การทำงาน" หรือเปล่า () ในระหว่าง Prev_Blank2 และวันที่ของการบันทึกปัจจุบัน เมื่อใช้วันนี้เราสามารถส่งคืนค่าสุดท้ายสำหรับผลรวมสะสม

หวังว่านี่จะเป็นการหลอกลวง;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.