简单回复下,水平有限,套用须谨慎:
动态ABC是一种常见的需求,因此熟练以后可以作为套路使用,不过要小心应用场景——例如这里筛选列和计算列不是同一列。
ABC的算法你已经掌握,只要把相同的逻辑转换成度量值(注意充分理解计算流程中筛选条件的变化)即可:
先写一个简单的求和度量值Sales做铺垫(只是为了给其他度量值引用):
然后是核心度量值:
- =
VAR PartNumbers =
CALCULATETABLE (
DISTINCT ( '分类'[Part number] ),
ALL ( '分类' ),
ALLSELECTED ( '分类'[PC] )
) //注意最后一项不要写成DISTINCT()或者VALUES(),因为它们会被当前行/列筛选,导致各个单元格的总集不一样从而算错
// 这里偷懒直接用ALL('分类'[Part number])也可以,因为下面计算Sales时仍然会考虑PC列筛选,然后无销售额的会被过滤
VAR AllSales =
SUMX ( PartNumbers, [Sales] ) // 所有已选择项在当前筛选条件下的Sales的和,即总额(分母)
VAR CurrentSales = [Sales] // 固定当前项的销售额,下面引用的时候值不会变,因此不再需要EARLIER()
VAR LargeSales =
SUMX ( FILTER ( PartNumbers, [Sales] >= CurrentSales ), [Sales] ) //ABC核心(分子)
VAR SalesPercent =
DIVIDE ( LargeSales, AllSales )
VAR Result =
SWITCH ( TRUE (), SalesPercent < 0.8, "A", SalesPercent = CurrentSales ), [Sales] )
VAR SalesPercent =
DIVIDE ( LargeSales, AllSales )
RETURN
FORMAT(SalesPercent,"0.0%")
复制代码
同样拖到[值]字段就可以了。
不过还有一个小问题,如果你像附件中那样将其他列拖到[行]字段,而且这些额外字段没有全部折叠,计算就会发生错误,这是因为透视表中会将[行]字段中的多列合并成一个tuple做筛选,在计算的时候触发arbitrarily shaped filters流程,所以上面的写法要适当修改:
- =
VAR PCs =
ALLSELECTED ( '分类'[PC] )
//先固定外部切片器所选项,注意不能用ALLSELECTED()替换下面PCs
VAR PartNumbers =
CALCULATETABLE ( DISTINCT ( '分类'[Part number] ), ALL ( '分类' ), PCs )
//必须清除全表筛选,然后恢复外部PC列筛选,这里有点绕,要细细想,下同
VAR AllSales =
CALCULATE ( SUMX ( PartNumbers, [Sales] ), ALL ( '分类' ), PCs )
VAR CurrentSales = [Sales]
VAR LargeSales =
CALCULATE (
SUMX ( FILTER ( PartNumbers, [Sales] >= CurrentSales ), [Sales] ),
ALL ( '分类' ),
PCs
)
VAR SalesPercent =
DIVIDE ( LargeSales, AllSales )
VAR Result =
SWITCH ( TRUE (), SalesPercent < 0.8, "A", SalesPercent < 0.9, "B", "C" )
RETURN
Result
复制代码
累计百分比同样改就好了。
越简单越不容易错,尽量使用前面的写法,保护[行]字段没有累赘的列。
10284101709572.zip
(873.28 KB, 下载次数: 0)
|