人生没有彩排
每一天都是现场直播

XF.Analysis.ABCClass

语法作用

返回帕累托分析的ABC分类。第一参数:任意返回表的表达式,第二参数:任意标量表达式,将在外部计值环境和第一参数提供的行上下文中计值。

将迭代第一参数的表的每一行,计算第二参数的表达式,并以第二参数在外部计值环境中的结果为当前值,计算出大于等于当前值的累计值的占比,再基于累计占比计算ABC分类。

参数 thresholdA 和 thresholdB 分别表示 A 类与 B 类的累计占比阈值,通常设置为 A=0.8、B=0.9,即:累计占比在 0.8 以内为 A 类,在 0.8~0.9 之间为 B 类,其余为 C 类。

注:如果当前值(第二参数在外部计值环境中的结果)为空则直接返回空值。

XF.Analysis.ABCClass(tbl:table,expression:expr,thresholdA:double,thresholdB:double)

函数代码

该函数的实现代码如下:

/// 返回帕累托分析的ABC分类。第一参数:任意返回表的表达式,第二参数:任意标量表达式,将在外部计值环境和第一参数提供的行上下文中计值。将迭代第一参数的表的每一行,计算第二参数的表达式,并以第二参数在外部计值环境中的结果为当前值,计算出大于等于当前值的累计值的占比,再基于累计占比计算ABC分类。参数 thresholdA 和 thresholdB 分别表示 A 类与 B 类的累计占比阈值,通常设置为 A=0.8、B=0.9,即:累计占比在 0.8 以内为 A 类,在 0.8~0.9 之间为 B 类,其余为 C 类。注:如果当前值(第二参数在外部计值环境中的结果)为空则直接返回空值
FUNCTION XF.Analysis.ABCClass = (tbl:table,expression:expr,thresholdA:double,thresholdB:double) => 
    VAR CurrentVal = expression
    RETURN 
    IF(thresholdA>=thresholdB || thresholdB>=1 || thresholdA<0,
        ERROR("ABC阈值参数的范围错误!"),
        IF(NOT ISBLANK(CurrentVal),
            VAR TempTbl = ADDCOLUMNS(tbl,"@Val",expression)
            VAR TotalVal = SUMX(TempTbl,[@Val])
            VAR CumulativeSum = 
                IF(MAXX(TempTbl,[@Val])<CurrentVal,
                    TotalVal,
                    SUMX(FILTER(TempTbl,[@Val] >= CurrentVal),[@Val])
                )
            VAR CumPct = DIVIDE(CumulativeSum,TotalVal)
            RETURN
            MID("ABC",RANKX({thresholdA,thresholdB,1},[Value],CumPct,ASC),1)
        )
    )

应用示例

按产品名称与采购价进行帕累托分析,返回其对应的ABC分类。其中,累计占比在 0.8 以内为 A 类,在 0.8~0.9 之间为 B 类,其余为 C 类。

现在不需要创建多个度量值,只需要一个函数即可完成,如下图所示:

还支持分类处理的场景,如下图所示:

需要注意的是,该函数不适合需要明确区分重复值的场景,如果需要逐个处理重复值以得到不同的累计值并返回对应的ABC分类,则可以使用XF.Analysis.ABCClassExact函数。

赞(0) 打赏
版权声明:本文为夕枫的原创文章,著作权归作者所有,未经允许不得转载
文章名称:《PowerBI DAX自定义函数-XF.Analysis.ABCClass》
文章链接:https://www.ximaple.com/posts/1547.html
订阅评论
提醒
guest
0 评论
最新
最久 最赞
内联反馈
查看所有评论

觉得文章有用的话就支持一下吧~

感谢您的打赏支持,我将持续输出有价值的内容!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册

Operation don't support