You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerBI中DAX实现跨表日期区间匹配工时表所属期间

PowerBI中DAX实现日期区间匹配创建新表

问题场景

需要创建新表verpPrjTimesheets,将erpPrjTimesheets中的每条工时记录,匹配到cfgTimesheetMnth表中对应的工时期间(判断条件:tsDate落在tsDateStart与tsDateEnd区间内)。原代码使用LOOKUPVALUE无法处理区间匹配,需替换为可行方案。

示例数据

表cfgTimesheetMnth(期间配置表)

PeriodtsDateStarttsDateEnd
2023022023-01-282023-02-24
2023032023-02-252023-03-29
2023042023-03-302023-04-26

表erpPrjTimesheets(工时记录表)

EmpNotsDateHrs
1001012023-03-057
1001012023-03-306

期望结果

新表verpPrjTimesheets新增tsPeriod列,对应匹配的期间:

EmpNotsDateHrstsPeriod
1001012023-03-057202303
1001012023-03-306202304

解决方案

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:35:34