语法作用
计算基于数值排序的累计占比。第一参数:任意返回表的表达式,第二参数:任意标量表达式,将在外部计值环境和第一参数提供的行上下文中计值。
将迭代第一参数的表的每一行,计算第二参数的表达式,并以第二参数在外部计值环境中的结果为当前值,最后根据sortOrder参数计算累计值(0=降序/计算大于等于当前值的和,1=升序/计算小于等于当前值的和),最终将累计值除以总计得出累计占比。
注意:如果当前值为空则直接返回空值。
XF.Analysis.CumulativePct(tbl:table,expression:expr,sortOrder:int64)
函数代码
该函数的实现代码如下:
/// 计算基于数值排序的累计占比。第一参数:任意返回表的表达式,第二参数:任意标量表达式,将在外部计值环境和第一参数提供的行上下文中计值。将迭代第一参数的表的每一行,计算第二参数的表达式,并以第二参数在外部计值环境中的结果为当前值,最后根据sortOrder参数计算累计值(0=降序/计算大于等于当前值的和,1=升序/计算小于等于当前值的和),最终将累计值除以总计得出累计占比。注:如果当前值为空则直接返回空值
FUNCTION XF.Analysis.CumulativePct = (tbl:table,expression:expr,sortOrder:int64) =>
VAR BaseVal = expression
RETURN
IF(NOT sortOrder IN {0,1},
ERROR("sortOrder参数的可选取值仅为0或1"),
IF(NOT ISBLANK(BaseVal),
VAR TempTbl = ADDCOLUMNS(tbl,"Val",expression)
VAR TotalVal = SUMX(TempTbl,[Val])
VAR CumulativeSum =
IF(sortOrder>0,
SUMX(FILTER(TempTbl,[Val]<=BaseVal),[Val]),
IF(MAXX(TempTbl,[Val])<BaseVal,
TotalVal,
SUMX(FILTER(TempTbl,[Val]>=BaseVal),[Val])
)
)
RETURN
DIVIDE(CumulativeSum,TotalVal)
)
)
应用示例
按产品类别分类,降序累计各产品的采购价格,计算累计占比。
XF.Analysis.CumulativePct(ALL('产品'[产品名称]),[采购价],0)
结果如下图所示:

需要注意的是,该函数不适合需要明确区分重复值的场景,如果需要逐个处理重复值以得到不同的累计占比,则可以使用XF.Analysis.CumulativePctExact函数。





