• 数据可视化之DAX篇(五) 使用PowerBI的这两个函数,灵活计算各种占比


    https://zhuanlan.zhihu.com/p/57861350

    计算个体占总体的比例是一个很常见的分析方式,它很简单,就是两个数字相除,但是当需要计算的维度、总体的范围发生动态变化时,如何灵活且快速的计算出各种占比,还是需要动一点心思的。

    本文就通过 DAX 中的 ALL 和 ALLSELECTED 函数来看看在 PowerBI 中是如何快速计算出各种占比的。


    数据为虚拟的某网上商城的电子产品的销售记录,我们根据销售额指标来计算某产品的占总体或者类别的比例。

    首先写一个销售额的度量值,

    销售额 = SUM('订单'[销售额])

    在矩阵中看看该度量值的结果,

     

    总体占比

     

    计算占总体的比例,就是每一个类别的销售额都除以总计数,计算总计数,可以用 ALL 函数清除外部上下文的筛选,如果单独计算出总计销售额,可以这样写,

    销售额总计=CALCULATE([销售额],ALL('产品')

    将该度量值放入到卡片图中,可以看到正好是2,305,350.

    这里为了更加直观,我们直接写出占总体比例的度量值,

    总体占比 = DIVIDE([销售额],CALCULATE([销售额],ALL('产品')))

    矩阵中结果如下,

     

    为了进一步分析具体每一种产品的占比,把产品名称展开,

     

     

    分类占比

    每一种产品相对于总体的比例都计算出来了,但是如果还需要知道每一种产品占所属分类的比例,可以这样写,

     

    分类占比 =
    DIVIDE([销售额],CALCULATE([销售额],ALL('产品'[产品名称])))

     

    结果如下,

     

     

    这张表中最后一列每种产品占分类的比例正是想要的结果,这两个度量值的区别就在于ALL('产品')和ALL('产品'[产品名称])。

    ALL('产品')是清除对产品表上所有的列的上下文,正如上面看到的,CALCULATE([销售额],ALL('产品')的结果就是总体的销售额。

     

    而ALL('产品'[产品名称])仅仅是清除产品名称的上下文,如果上下文不是产品名称,那么它还是会继续计算,比如第一行是类别:电脑外设,它不属于产品名称,那么这个度量值会计算电脑外设的销售额。

    可以单独写一个度量值观察一下结果,

     

    销售额 分类 = CALCULATE([销售额],ALL('产品'[产品名称]))

    可以看出每一个产品计算出的销售额都是所属分类的汇总销售额,正是利用这个特点,拿产品的销售除以类别合计销售额,就得到的每种产品占所属类别的比例。

    按筛选上下文计算总体占比

     

    现在如果想分析具体某几个产品的数据,用产品名称做个切片器,效果如下,

     

     

     

    除了类别行和总计行的占比发生了变化,每一种产品的占比数据并没有变化。

    如果我们只是想分析所选的这几种产品,把所选这几种产品作为一个整体,来分析每种产品占所选产品的比例,这个结果显然不能让人满意。

     

    是时候请出ALLSELECTED函数登场表演了!

     

    要计算每一种产品占所选品种合计销售额的比例,度量值如下,

    按筛选 占总体% =
    DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED('产品')))

     

     

    最后一列的占比,无论我们筛选哪些产品,总体比例都是100%,而每一种产品,都是该产品占所选产品的比例。

    ALLSELECTED函数针对外部上下文中进行筛选计算,正好是我们需要的效果。

     

    按筛选上下文计算类别占比

    如果我们想进一步计算按外部所选的产品,并且按照产品类别,来计算相对产品类别的百分比,怎么做呢?

    也许你已经想到了,和上面一样,使用ALLSELECTED('产品'[产品名称],

    按筛选 占分类% =
    DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED('产品'[产品名称])))

     

     

    正是期望中的结果。

    从这几个实例可以看出,使用DAX来计算占比非常灵活,稍微一改动,结果大不同,以硬盘为例,通过ALL和ALLSELECTED函数和参数的变化,获得了4个不同的占比,并且每种占比都具有一定的意义,都是在某种业务场景下的真实需求。

     

    总结

     

    其实上面计算的每一种占比,分子都不变,只是通过ALL和ALLSELECT函数及其参数的选择操控不同的上下文环境,来控制分母的计算,进而得到我们所需要的占比。

     

    1,计算占总体的比例,

    总体占比 =
    DIVIDE([销售额],CALCULATE([销售额],ALL('产品')))

     

    2,计算占类别的比例,

    分类占比 =
    DIVIDE([销售额],CALCULATE([销售额],ALL('产品'[产品名称])))

     

    3,按外部筛选上下文,计算占总体的比例,

    按筛选 占总体% =
    DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED('产品')))

     

    4,按外部筛选上下文,计算占类别的比例,

    按筛选 占分类% =
    DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED('产品'[产品名称])))

     

    DAX函数并不是很容易理解,必须基于不同的上下文环境来观察结果,通过不断的练习、思考背后的逻辑,才能更好的掌握。

  • 相关阅读:
    PHP导出sql文件
    BugScan插件编写高(gǎo)级(jī)教程
    php父级目录文件包函问题
    检测web服务器指定位置大文件是否存在
    解决Linux关闭SSH,终端后运行程序终止问题(包括后台)
    Python Matplotlib绘图库 安装
    校园网突围之路由器开wifi__windows版
    [openwrt 项目开发笔记]: 传送门
    [Openwrt 项目开发笔记]:PHP+Nginx安装(七)
    [Openwrt 项目开发笔记]:MySQL配置(六)
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12807759.html
Copyright © 2020-2023  润新知