最近状态不好,每天晚上回来基本都是会去骑行,所以一直没时间更新,特别是今天骑行了五十公里,着实是废了,骑行也要讲究循序渐进啊。
DAX实现TopN和其他
那么今天就来点轻松的内容,先前介绍过使用RANKX计算层级排名时有说到利用RANKX也可以实现TopN和其他,比如我们想知道每个类别Top3的商品销售和其他产品的销售,就像下面这样。
为了实现每个类别Other部门的销售额,首先需要构造一张包含商品名为Others的商品表
Product Names =
UNION ( ALLNOBLANKROW ( 'Product'[Product Name] ), { "Others" }
)
然后还要和产品表建立关系
之后还要重新写下销售额和排名的度量
Sales Amt = // topn和其他的商品销售额
VAR SalesOfAll =CALCULATE ([Sales Amount],REMOVEFILTERS ( 'Product Names' ))
RETURNIF (NOT ISINSCOPE ( 'Product Names'[Product Name] ),SalesOfAll,VAR ProductsToRank = [TopN 值]VAR SalesOfCurrentProduct = [Sales Amount]VAR IsOtherSelected =SELECTEDVALUE ( 'Product Names'[Product Name] ) = "Others"RETURNIF (NOT IsOtherSelected,SalesOfCurrentProduct,VAR VisibleProducts = // 当前的商品名CALCULATETABLE (VALUES ( 'Product' ),ALLSELECTED ( 'Product Names'[Product Name] ))VAR ProductsWithSales =ADDCOLUMNS (VisibleProducts,"@SalesAmount", [Sales Amount])VAR SalesOfTopProducts = // 对商品进行排序SUMX (TOPN (ProductsToRank,ProductsWithSales,[@SalesAmount]),[@SalesAmount])VAR SalesOthers = // 总计-topn就是其他的SalesOfAll - SalesOfTopProductsRETURNSalesOthers))
排名
Ranking =
SWITCH( TRUE(),ISINSCOPE ( 'Product Names'[Product Name] ),VAR ProductsToRank = [TopN 值]VAR SalesAmount = [Sales Amount]VAR IsOtherSelected =SELECTEDVALUE ( 'Product Names'[Product Name] ) = "Others"RETURNIF (IsOtherSelected, // 对其他进行排序-- Rank for OthersProductsToRank + 1,-- //对topN的商品进行排序IF (SalesAmount > 0,VAR VisibleProducts =CALCULATETABLE (VALUES ( 'Product' ),ALLSELECTED ( 'Product Names' ))VAR Ranking =RANKX (VisibleProducts,[Sales Amount],SalesAmount)RETURNIF (Ranking > 0 && Ranking <= ProductsToRank,Ranking))),ISINSCOPE ( 'Product'[Category] ),RANKX ( ALLSELECTED ( 'Product'[category] ),CALCULATE([Sales Amount],REMOVEFILTERS( 'Product Names' )))
)
占比
% Parent 7 =
SWITCH( TRUE(),ISINSCOPE ( 'Product Names'[Product Name] ),DIVIDE( [Sales Amt], CALCULATE ( [Sales Amount],REMOVEFILTERS ( 'Product Names' ) ) ),ISINSCOPE ( 'Product'[Category] ),DIVIDE( [Sales Amount], CALCULATE( [Sales Amount], REMOVEFILTERS( 'Product Names' ), ALLSELECTED( 'Product' ) ))
)
相信这么长的代码已经可以劝退很多人了,特别是这还是最简单的情况,只是商品名层级有topN和其他,如果每一层都需要是Top+其他呢?至少,我已经开始崩溃了,那有没有什么方法可以快速来实现这样多变的TopN的需求呢?
Inforiver professional实现Topn和其他
使用Inforiver professional可以不用建新表,也不用写新的度量值,就可以快速实现TopN和其他的效果。
Sales Amount = SUMX ( Sales, Sales[Quantity] * Sales[Net Price] )
设置起来也比较简单,应用商店加载这个图表就好(图表收费),然后找到TopN选项,设置我们需要展示topn的列即可
这里,设置每个层级都是Top3
效果如下,会发现每个层级都是Top3和其他,
也可以快速添加占比和排名
Inforiver professional实现
除了实现Topn和其他,该图表还可以实现其他功能,比如热力图,我们知道PowerBI中只能按列来添加条件格式,想实现一些特殊要求的条件格式,比如按行,或者按表就需要写很多度量值,而且使用Inforiver professional则可以轻松实现
再次感叹,第三方图表是真好用,微软能不能好好改进了自带图表的功能。下周就要国庆假期了,终于可以回家了。