语法作用
返回帕累托分析的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函数。





