不写DAX实现TopN和其他
最近状态不好,每天晚上回来基本都是会去骑行,所以一直没时间更新,特别是今天骑行了五十公里,着实是废了,骑行也要讲究循序渐进啊。
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' )
)
RETURN
IF (
NOT ISINSCOPE ( 'Product Names'[Product Name] ),
SalesOfAll,
VAR ProductsToRank = [TopN 值]
VAR SalesOfCurrentProduct = [Sales Amount]
VAR IsOtherSelected =
SELECTEDVALUE ( 'Product Names'[Product Name] ) = "Others"
RETURN
IF (
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 - SalesOfTopProducts
RETURN
SalesOthers
)
)
排名
Ranking =
SWITCH(
TRUE(),
ISINSCOPE ( 'Product Names'[Product Name] ),
VAR ProductsToRank = [TopN 值]
VAR SalesAmount = [Sales Amount]
VAR IsOtherSelected =
SELECTEDVALUE ( 'Product Names'[Product Name] ) = "Others"
RETURN
IF (
IsOtherSelected, // 对其他进行排序
-- Rank for Others
ProductsToRank + 1,
-- //对topN的商品进行排序
IF (
SalesAmount > 0,
VAR VisibleProducts =
CALCULATETABLE (
VALUES ( 'Product' ),
ALLSELECTED ( 'Product Names' )
)
VAR Ranking =
RANKX (
VisibleProducts,
[Sales Amount]
,SalesAmount
)
RETURN
IF (
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则可以轻松实现
再次感叹,第三方图表是真好用,微软能不能好好改进了自带图表的功能。下周就要国庆假期了,终于可以回家了。
本篇文章来源于微信公众号: PowerBI木小桼