DAX实现累计求和达指定值时停止计算的方法求助
解决DAX累计销售占比达到阈值后停止计算的问题
首先确认基础度量逻辑(确保现有度量的正确性):
- 总销售额:
Total Sales = SUM(Sales[Invoice Value]) - 单客户销售占比:
PC % Value = DIVIDE(SUM(Sales[Invoice Value]), [Total Sales]) - 客户销售额排名(降序,1为最大客户):
PC Value Ranking = RANKX(ALL(Customers), [PC % Value],, DESC, DENSE)
你的现有度量存在两个问题:一是仅实现了取当前客户及之前客户的集合,未达到累计占比触发阈值后停止计算的要求;二是EARLIER失效,因为ALL(Customers)清除了客户上下文,无法正确引用外部排名值。
修正后的度量值(以80%阈值为例)
PC Sales Invoice Value Pareto 2 = VAR Threshold = 0.8 // 替换为你需要的特定阈值,如0.7代表70% VAR CurrentCustomerRank = [PC Value Ranking] // 计算当前客户及所有排名更靠前客户的累计销售占比 VAR CumulativePct = SUMX( FILTER( ALL(Customers), [PC Value Ranking] <= CurrentCustomerRank ), [PC % Value] ) // 累计值超过阈值时返回阈值,否则返回实际累计值 RETURN MIN(CumulativePct, Threshold)
逻辑说明
- 阈值定义:通过
Threshold变量设置累计停止的目标值,可按需修改。 - 当前排名捕获:用
CurrentCustomerRank保存当前上下文客户的排名,规避ALL(Customers)清除上下文导致的引用问题。 - 累计计算:用
SUMX+FILTER筛选出所有排名≤当前客户的对象,求和其销售占比。 - 停止逻辑:通过
MIN函数,当累计占比超过阈值时直接返回阈值,后续客户的累计值不再增长。
进阶需求(仅计算到触发阈值的客户,后续客户返回0)
若需要累计达到阈值后,后续客户的度量值返回0(而非保持阈值),可修改返回逻辑:
PC Sales Invoice Value Pareto 2 = VAR Threshold = 0.8 VAR CurrentCustomerRank = [PC Value Ranking] VAR CumulativePct = SUMX( FILTER(ALL(Customers), [PC Value Ranking] <= CurrentCustomerRank), [PC % Value] ) // 获取首次超过阈值的客户排名 VAR FirstRankExceedThreshold = MINX( FILTER( ADDCOLUMNS(ALL(Customers), "@Cumulative", SUMX(FILTER(ALL(Customers), [PC Value Ranking] <= [PC Value Ranking]), [PC % Value])), [@Cumulative] > Threshold ), [PC Value Ranking] ) RETURN IF(CurrentCustomerRank < FirstRankExceedThreshold, CumulativePct, 0)
内容的提问来源于stack exchange,提问作者stefano panero
相关产品推荐
相关产品推荐

