DAX中SUMMARIZE与FILTER实现复现性指标的面积图展示问题
DAX面积图统计连续达标用户问题解决
需求
统计过去连续[meses]个月内,每月操作次数≥[n_veces]的唯一用户数,以日期(月度)为X轴展示该指标的变化趋势。
现有DAX代码
TotalUsuariosRecurrentes = VAR SELECTOR = IF([Recurrencia numerico] = 365,12,[meses]) VAR SELECTOR_veces = [n_veces] VAR hoy = TODAY() VAR FechaIni = EDATE(hoy,SELECTOR * -1) VAR FechaFin = hoy VAR ResumenUsuarios = SUMMARIZE( FILTER( Tabla, Tabla[EndOfMonth] >= FechaIni && Tabla[EndOfMonth] <= FechaFin ), Tabla[UserId], Tabla[EndOfMonth], "SumaVisitas", SUM(Tabla[N_VISITAS]) ) VAR UsuariosRecurrentes = SELECTCOLUMNS( FILTER( SUMMARIZE( ResumenUsuarios, [UserId], "MesesConVisitas", COUNTROWS( FILTER( ResumenUsuarios, [UserId] = EARLIER([UserId]) && [SumaVisitas] >= SELECTOR_veces ) ) ), [MesesConVisitas] >= SELECTOR ), "UserId", [UserId] ) RETURN CALCULATE( DISTINCTCOUNT(Tabla[UserId]), FILTER( Tabla, Tabla[UserId] IN UsuariosRecurrentes && Tabla[EndOfMonth] >= FechaIni && Tabla[EndOfMonth] <= FechaFin ) )
参数说明
- [n_veces]:操作次数阈值(整数)
- [meses]:需要连续达标的月份数(整数)
- [Recurrencia numerico]:切片器参数,选择“Mensual”时为30,否则为365(整数)
问题现象
- 参数可正常筛选表格,但当[meses]取值大于1时,面积图停止显示数据
- 预期效果:近3个月(X轴)每月显示1个符合条件的用户(该用户过去3个月每月至少完成2次操作),但仅KPI可视化能正常显示总数,无法展示趋势
问题根源
原度量值存在两个核心问题:
- 固定时间窗口:使用
TODAY()作为时间窗口的终点,忽略了面积图X轴的月度上下文,导致所有月份都计算“从今天倒推N个月”的用户,而非“截至该月份倒推N个月”的用户 - 上下文冲突:计算逻辑未响应X轴的日期筛选,当X轴是单个月份时,原公式的全局时间窗口与局部日期上下文冲突,导致无数据返回
修改后的DAX代码
TotalUsuariosRecurrentes_Tendencia = VAR SELECTOR = IF([Recurrencia numerico] = 365, 12, [meses]) VAR SELECTOR_veces = [n_veces] -- 获取当前上下文的最大日期(适配X轴的月度维度) VAR FechaFin_Contexto = MAX(Tabla[EndOfMonth]) VAR FechaIni_Contexto = EDATE(FechaFin_Contexto, -SELECTOR) -- 按用户+月度汇总操作次数 VAR ResumenUsuarios = SUMMARIZE( FILTER( ALL(Tabla), -- 移除局部上下文,确保计算完整的时间窗口 Tabla[EndOfMonth] >= FechaIni_Contexto && Tabla[EndOfMonth] <= FechaFin_Contexto ), Tabla[UserId], Tabla[EndOfMonth], "SumaVisitas", SUM(Tabla[N_VISITAS]) ) -- 筛选出在时间窗口内每个月都达标的用户 VAR UsuariosCumplen = SELECTCOLUMNS( FILTER( SUMMARIZE( ResumenUsuarios, Tabla[UserId], "MesesCumplidos", COUNTROWS( FILTER( ResumenUsuarios, Tabla[UserId] = EARLIER(Tabla[UserId]) && [SumaVisitas] >= SELECTOR_veces ) ) ), [MesesCumplidos] = SELECTOR -- 必须刚好等于要求的连续月份数 ), "UserId", Tabla[UserId] ) RETURN -- 统计符合条件的用户数,确保响应当前上下文的日期(仅保留该月份的用户记录) CALCULATE( DISTINCTCOUNT(Tabla[UserId]), Tabla[UserId] IN UsuariosCumplen, Tabla[EndOfMonth] = FechaFin_Contexto )
关键修改点
- 替换
TODAY()为MAX(Tabla[EndOfMonth]),让时间窗口随X轴的月份动态变化,支持历史趋势展示 - 使用
ALL(Tabla)确保在计算用户达标情况时,不受X轴单个月份的上下文限制,能完整计算连续N个月的达标情况 - 最终计数时添加
Tabla[EndOfMonth] = FechaFin_Contexto,确保每个X轴月份只统计截至该月符合条件的用户数 - 将
[MesesConVisitas] >= SELECTOR改为[MesesCumplidos] = SELECTOR,精准匹配“连续N个月每月都达标”的需求
内容的提问来源于stack exchange,提问作者OscarCamean
相关产品推荐
相关产品推荐

