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

求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:47:52