计算连续N个月满足条件的客户数量

fyxsky 发布于 15 天前 5 次阅读


AI 摘要

想知道如何快速统计连续N个月都有销量的客户数吗?本文揭秘两种高效DAX计算方案,从基础筛选到虚拟表构建,一步步拆解复杂逻辑,让你轻松应对多条件连续统计需求。

当前有一个需求,要计算过去三个月,每个月都有销售额的客户有多少个。

数据Demo如下图:

1

在实际计算中,有很多方式来计算,不过经过优化,最终确定使用两种计算方案。

使用虚拟表来计算

CountCustomers = 
-- 第4步,对于第3步筛选出来的表,求行数
COUNTROWS(
    -- 第2步,基于第一步的表,建立虚拟表,包含CustomerID列和计算出来的有销量的月数。
    FILTER(
        SUMMARIZE(
            -- 第1步,筛选出只包含202302-202304的数据的表
            FILTER(
                Sales,
                Sales[YearMonth] >= "202302" && Sales[YearMonth] <= "202304"
            ),
            Sales[CustomerID],
            "SalesMonths", DISTINCTCOUNT( Sales[YearMonth] )
        ),
        -- 第3步,在Filter中对于第2步的虚拟表,筛选出有销量约束等于3的月。
        [SalesMonths] = 3
    )
)

2

公式并不复杂,对于初学者,有几点可以作为参考:

  1. SUMMARIZE( ) 中,第一个参数是表,而Filter( )的结果也是一个表,所以可以用Filter( )作为SUMMARIZE( )的第一个参数。
  2. 同理,COUNTROWS( ),第一个参数也是表,也可以用Filter( )的结果作为第一参数。
  3. 在Filter( )中的虚拟表中建立的虚拟列,可以作为Filter( )的第二参数进行条件判断。

不使用虚拟表进行计算

CountCustomers = 
CALCULATE(
    DISTINCTCOUNT( Sales[CustomerID] ),
    FILTER(
        ALL( Sales[CustomerID] ),
        CALCULATE(
            DISTINCTCOUNT( Sales[YearMonth] ),
            Sales[YearMonth] >= "202302" && Sales[YearMonth] <= "202304"
        ) = 3
    )
)

这个计算方式,我没有仔细去分析和前一个方式的运算效率哪个更高。不过从我的感觉来看,两个计算方式运行效率应该差不多,估计在百万行级别以下运行效率不会有明显差异。如果到亿行级别以上,我估计第一种的效率更高。

最后更新于 2025-12-27