如何创建基于指定结束日期的SUMX求和度量值?
解决DAX度量值计算指定结束日期下总时长的问题
我来帮你搞定这个度量值!你的核心需求是基于用户指定的结束日期,动态计算每个事件的有效时长总和——当指定日期晚于事件自身的EndDate时,就用事件的EndDate,否则用指定日期,完全替代原来的计算列逻辑对吧?
首先,我们可以先准备一个灵活的日期选择方式(当然你也可以硬编码日期,但参数更适配动态场景):
- 在Power BI中,点击「建模」选项卡 → 「新建参数」→ 选择「日期」类型,设置好日期范围(比如2018-01-01到2020-01-01),步长选天,命名为
指定结束日期。
接下来就是核心的度量值代码,用SUMX迭代每行数据完成逐行计算后求和:
总时长(按指定结束日期) = VAR SelectedEndDate = SELECTEDVALUE('指定结束日期'[指定结束日期]) RETURN SUMX( Events, VAR ActualEndDate = MIN(Events[EndDate], SelectedEndDate) VAR DaysInPeriod = DATEDIFF(Events[StartDate], ActualEndDate, DAY) // 处理开始日期晚于实际结束日期的异常情况,避免出现负数 VAR ValidDays = MAX(DaysInPeriod, 0) VAR EventCount = DIVIDE(ValidDays, Events[Interval], 0) // 用DIVIDE避免除以0的错误 RETURN EventCount * Events[Duration (h)] )
代码细节解释:
SelectedEndDate:获取你通过参数选择的目标结束日期ActualEndDate:对每个事件取「指定结束日期」和「事件自身EndDate」的较小值,完美实现你要的逻辑DaysInPeriod:计算事件StartDate到ActualEndDate的天数差ValidDays:确保如果事件还没开始就到了指定日期(StartDate晚于ActualEndDate),天数计为0,不会出现负数结果EventCount:用有效天数除以Interval得到事件发生次数,DIVIDE的第三个参数是除数为0时的默认返回值(这里设为0)- 最后每行的事件次数乘以
Duration (h),再通过SUMX累加所有行的结果
测试你的示例场景:
当你选择指定结束日期为2019-09-01时:
- 事件1:
ActualEndDate为2019-09-01,天数差610,事件次数≈17.4286,时长≈25.271 - 事件2:
ActualEndDate为2019-09-01,天数差200,事件次数100,时长5 - 事件3:
ActualEndDate为自身的2019-07-01,天数差30,事件次数30,时长1.5 - 总和为25.271+5+1.5=31.771,完全符合你的预期
如果不需要动态参数,想直接硬编码指定日期,只需要把SelectedEndDate改成固定日期即可,比如:
VAR SelectedEndDate = DATE(2019,9,1)
这样就能完美替代原来的计算列,实现动态的度量值计算啦!
内容的提问来源于stack exchange,提问作者Peter Rundqvist
相关产品推荐
相关产品推荐

