不写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木小桼

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注