DAX计算指定日期区间累计总值求助:去年+1月至当前行日期
DAX实现指定日期区间总值计算的正确方案
需要计算proces表中,从当前行日期的去年加1个月到当前行日期之间的HOURS字段总和,对应Excel中SUM(C5:C16)的逻辑(C5为去年+1个月的销售额,C16为当前行日期的销售额)。
用户尝试的无效/错误公式
1. 未返回求和值的公式
var Rolling = CALCULATE(sum('proces'[HOURS]),DATESINPERIOD('Date'[DateField],ENDOFMONTH('proces'[date_start]),-12,MONTH))
问题:DATESINPERIOD的周期方向与起始点逻辑不匹配「去年+1个月到当前日期」的需求区间。
2. 语法与逻辑无效的公式
SumX ( var prev=DATEADD(DATEADD('proces'[date_start] ,-1,YEAR),+1,MONTH) return Filter ( 'proces', 'proces'[date_end] <= Earlier ( 'proces'[date_end] ) && 'proces'[date_start]>=prev, 'proces'[HOURS])
问题:SUMX语法结构错误,且EARLIER引用当前行上下文时逻辑混乱,未正确关联目标日期区间。
3. 无返回结果的公式
CALCULATE( SUMX('proces','proces'[HOURS]), DATESBETWEEN( 'Date'[DateField], STARTOFMONTH(DATEADD(LASTDATE('Date'[DateField]),-1,MONTH)), ENDOFMONTH(DATEADD('Date'[DateField],-1,MONTH)) ) )
问题:DATESBETWEEN定义的是上个月整月区间,完全不符合「去年+1个月到当前日期」的需求,且上下文引用逻辑错误。
正确DAX公式方案
方案1:使用日期表(推荐,符合DAX最佳实践)
假设存在规范的Date日期表,且proces表的date_start/date_end与Date[DateField]已建立关系:
累计小时数 = VAR CurrentDate = MAX('proces'[date_end]) -- 可根据实际需求替换为date_start VAR StartDate = DATEADD(DATEADD(CurrentDate, -1, YEAR), 1, MONTH) -- 计算去年+1个月的日期 RETURN CALCULATE( SUM('proces'[HOURS]), FILTER( ALL('Date'), 'Date'[DateField] >= StartDate && 'Date'[DateField] <= CurrentDate ) )
逻辑说明:
- 定义
CurrentDate获取当前行的目标日期(结束/开始日期) - 通过
DATEADD嵌套计算出「去年+1个月」的起始日期 - 用
ALL('Date')清除上下文干扰,筛选出目标区间内的日期并求和
方案2:不使用日期表(直接基于proces表)
若无独立日期表,可直接在proces表上计算:
累计小时数 = VAR CurrentRowDate = MAX('proces'[date_end]) -- 替换为实际的当前行日期字段 VAR StartDate = DATEADD(DATEADD(CurrentRowDate, -1, YEAR), 1, MONTH) RETURN SUMX( FILTER( ALL('proces'), 'proces'[date_end] >= StartDate && 'proces'[date_end] <= CurrentRowDate ), 'proces'[HOURS] )
逻辑说明:
- 用
ALL('proces')获取全表数据,筛选出符合日期区间的记录 - 通过
SUMX遍历筛选后的行,累加HOURS字段值
内容的提问来源于stack exchange,提问作者p sharif
相关产品推荐
相关产品推荐

