|
本帖最后由 shwangfeng 于 2020-3-10 16:51 编辑
简单回复下,水平有限,套用须谨慎:
动态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 < 0.9, "B", "C" )
- RETURN
- Result
复制代码
然后将PartNumber拖到[行]字段,将此度量值拖到[值]字段,根据PC制作切片器,这样就可以了。
累计百分比其中是倒数第二步,所以只要RETURN这一步就可以了(用FORMAT稍微格式化一下):
- =VAR PartNumbers =
- CALCULATETABLE (
- DISTINCT ( '分类'[Part number] ),
- ALL ( '分类' ),
- ALLSELECTED ( '分类'[PC] )
- )
- VAR AllSales =
- SUMX ( PartNumbers, [Sales] )
- VAR CurrentSales = [Sales]
- VAR LargeSales =
- SUMX ( FILTER ( PartNumbers, [Sales] >= 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
复制代码
累计百分比同样改就好了。
越简单越不容易错,尽量使用前面的写法,保护[行]字段没有累赘的列。
参考.zip
(873.28 KB, 下载次数: 8)
百度 DAX PowerBI 帕累托 ABC 之类的关键字也可以看到别的解法,只是要注意别人的场景和需求是否与你的一致。
|
|