DAX如何实现跨月假期拆分 统计各月对应工作日天数
DAX跨月假期工作日统计实现方案
完全可以通过DAX度量值实现该需求,核心逻辑是计算单条请假记录和当前时间上下文的日期交集,再筛选工作日计数即可,无需提前拆分原始请假表的跨月记录。
前置条件
先确认你的数据模型满足以下基础要求:
Leave表至少包含字段:LeaveType(假期类型:年假/病假/公共假期)、StartDate(请假开始日期)、EndDate(请假结束日期,默认包含当天)- 日历表(
Date表)为连续日期表,包含字段:Date(日期主键)、Working Day(是否工作日,取值为Yes/No)、Year、Month等时间维度字段
核心度量值
通用假期工作日统计度量值
该度量值可直接按年月、假期类型维度拆分统计,自动处理跨月记录:
假期使用天数 = VAR CurrentDateRange = VALUES('Date'[Date]) RETURN SUMX( 'Leave', VAR LeaveStart = 'Leave'[StartDate] VAR LeaveEnd = 'Leave'[EndDate] // 计算请假时段和当前上下文日期的交集 VAR OverlapDates = FILTER(CurrentDateRange, [Date] >= LeaveStart && [Date] <= LeaveEnd) // 统计交集内的工作日数量 VAR WorkDaysCount = COUNTROWS(FILTER(OverlapDates, RELATED('Date'[Working Day]) = "Yes")) RETURN ISNUMBER(WorkDaysCount) * WorkDaysCount )
你只需将Date'[Year]、Date'[Month]、Leave'[LeaveType]放到表格/矩阵的维度轴,即可自动得到各月各类假期的工作日天数,你举例的跨6/7/8月的病假也会自动拆分统计到对应月份。
上月专用统计度量值
如果需要固定取上月的统计结果,可基于上面的度量值扩展:
上月假期使用天数 = CALCULATE( [假期使用天数], DATEADD('Date'[Date], -1, MONTH), ALL('Date') )
注意事项
- 如果你的
EndDate是不包含当日的类型(比如请假1天的结束日期是次日零点),将交集判断条件的[Date] <= LeaveEnd修改为[Date] < LeaveEnd即可 - 单表数据量小于10万行的场景下,上述写法的性能足够使用;如果数据量更大,可以改用
GENERATE+SUMMARIZE的写法优化计算效率
内容的提问来源于stack exchange,提问作者JSY
相关产品推荐
相关产品推荐

