求DAX公式:计算ID在起止日期区间内各年份的出现次数
嘿,我来帮你搞定这个DAX统计的问题!你需要的是统计每个ID的开单到完成日期区间内覆盖的年份,每个年份标记是否存在(1或0)对吧?下面给你两种实用的解决方案:
解决方案:统计ID日期区间覆盖的年份
方法一:静态计算列(针对已知年份)
如果你的年份范围是固定的(比如示例里的2011-2013),直接给每个年份创建计算列就很简单:
2011年的计算列
2011 = VAR _currentID = '你的表名'[ID] VAR _startDate = '你的表名'[beg_dte] VAR _endDate = '你的表名'[cmpt_dte] RETURN IF( YEAR(_startDate) <= 2011 && YEAR(_endDate) >= 2011, 1, 0 )
同理创建2012、2013列
只需要把公式里的2011替换成对应的年份即可。这样每一行会直接显示该ID是否覆盖了对应年份,完美匹配你要的输出格式。
方法二:动态矩阵(适配任意年份)
如果年份范围不固定,或者未来会新增年份,用动态的方式更灵活:
1. 先创建年份维度表
用DAX生成一个包含所有唯一年份的表:
年份表 = DISTINCT( SELECTCOLUMNS( CALENDARAUTO(), -- 自动覆盖你数据里的所有日期范围 "年份", YEAR([Date]) ) )
2. 创建度量值
年份覆盖计数 = VAR _selectedYear = SELECTEDVALUE('年份表'[年份]) VAR _currentID = SELECTEDVALUE('你的表名'[ID]) VAR _idStartDate = CALCULATE(MAX('你的表名'[beg_dte]), '你的表名'[ID] = _currentID) VAR _idEndDate = CALCULATE(MAX('你的表名'[cmpt_dte]), '你的表名'[ID] = _currentID) RETURN IF( YEAR(_idStartDate) <= _selectedYear && YEAR(_idEndDate) >= _selectedYear, 1, 0 )
3. 构建可视化
把你的表名[ID]拖到行区域,年份表[年份]拖到列区域,年份覆盖计数拖到值区域,就能自动生成你要的交叉表啦。
为什么你之前的DAX不对?
你之前的公式用了MAX(table[ID])和EARLIER,逻辑上只聚焦于单个日期点,没有去判断年份是否落在ID的日期区间内,所以只能返回最后日期的年份结果,没法遍历区间内的所有年份。
内容的提问来源于stack exchange,提问作者Dax
相关产品推荐
相关产品推荐

