PowerBI中DAX实现跨表日期区间匹配工时表所属期间
PowerBI中DAX实现日期区间匹配创建新表
问题场景
需要创建新表verpPrjTimesheets,将erpPrjTimesheets中的每条工时记录,匹配到cfgTimesheetMnth表中对应的工时期间(判断条件:tsDate落在tsDateStart与tsDateEnd区间内)。原代码使用LOOKUPVALUE无法处理区间匹配,需替换为可行方案。
示例数据
表cfgTimesheetMnth(期间配置表)
| Period | tsDateStart | tsDateEnd |
|---|---|---|
| 202302 | 2023-01-28 | 2023-02-24 |
| 202303 | 2023-02-25 | 2023-03-29 |
| 202304 | 2023-03-30 | 2023-04-26 |
表erpPrjTimesheets(工时记录表)
| EmpNo | tsDate | Hrs |
|---|---|---|
| 100101 | 2023-03-05 | 7 |
| 100101 | 2023-03-30 | 6 |
期望结果
新表verpPrjTimesheets新增tsPeriod列,对应匹配的期间:
| EmpNo | tsDate | Hrs | tsPeriod |
|---|---|---|---|
| 100101 | 2023-03-05 | 7 | 202303 |
| 100101 | 2023-03-30 | 6 | 202304 |
解决方案
方法1:SELECTCOLUMNS + CALCULATE + FILTER
通过遍历工时记录,对每条记录筛选出符合区间的期间:
verpPrjTimesheets = SELECTCOLUMNS( erpPrjTimesheets, "EmpNo", [EmpNo], "tsDate", [tsDate], "Hrs", [Hrs], "tsPeriod", CALCULATE( VALUES(cfgTimesheetMnth[Period]), FILTER( cfgTimesheetMnth, erpPrjTimesheets[tsDate] >= cfgTimesheetMnth[tsDateStart] && erpPrjTimesheets[tsDate] <= cfgTimesheetMnth[tsDateEnd] ) ) )
- 逻辑说明:
SELECTCOLUMNS遍历erpPrjTimesheets的每条记录;CALCULATE + FILTER针对当前记录的tsDate,在cfgTimesheetMnth中筛选出符合区间的Period;VALUES确保返回单个值(需保证日期区间无重叠)。
方法2:GENERATE关联表
通过GENERATE将两个表按区间条件关联,再整理列:
verpPrjTimesheets = SELECTCOLUMNS( GENERATE( erpPrjTimesheets, FILTER( cfgTimesheetMnth, erpPrjTimesheets[tsDate] >= cfgTimesheetMnth[tsDateStart] && erpPrjTimesheets[tsDate] <= cfgTimesheetMnth[tsDateEnd] ) ), "EmpNo", [EmpNo], "tsDate", [tsDate], "Hrs", [Hrs], "tsPeriod", [Period] )
- 逻辑说明:
GENERATE为每条工时记录匹配符合区间的期间记录,再通过SELECTCOLUMNS保留需要的列并命名。
注意事项
- 需确保
cfgTimesheetMnth中的日期区间无重叠且连续,否则会出现一条工时记录匹配多个期间的错误; - 若存在
tsDate不在任何区间的记录,tsPeriod会返回空白,可通过IFERROR添加默认值处理,例如:"tsPeriod", IFERROR( CALCULATE( VALUES(cfgTimesheetMnth[Period]), FILTER( cfgTimesheetMnth, erpPrjTimesheets[tsDate] >= cfgTimesheetMnth[tsDateStart] && erpPrjTimesheets[tsDate] <= cfgTimesheetMnth[tsDateEnd] ) ), "无匹配期间" )
内容的提问来源于stack exchange,提问作者Jéan
相关产品推荐
相关产品推荐

