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

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





