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

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

  1. 数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?

    https://zhuanlan.zhihu.com/p/109964336 ​今年是闰年,有星友问我,在Power BI中,2月29日的上年同期是怎么计算的? 这是个好问题,正好梳理一下,Power ...

  2. 数据可视化之DAX篇(十二)掌握时间智能函数,同比环比各种比,轻松搞定!

    https://zhuanlan.zhihu.com/p/55841964 时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析.假设要计算上年同期的销量,在PowerBI中 ...

  3. 数据可视化之DAX篇(十六)如何快速理解一个复杂的DAX?这个方法告诉你

    https://zhuanlan.zhihu.com/p/64422393 经常有朋友提出一个问题,然后我给出一个DAX之后,TA又不是很理解,反复多次沟通才能把一个表达式讲清楚.或者TA自己写了一个 ...

  4. 数据可视化之DAX篇(十)在PowerBI中累计求和的两种方式

    https://zhuanlan.zhihu.com/p/64418286 假设有一组数据, 已知每一个产品贡献的利润,如果要计算前几名产品的贡献利润总和,或者每一个产品和利润更高产品的累计贡献占总体 ...

  5. 数据可视化之DAX篇(二)Power BI中的度量值和计算列,你搞清楚了吗?

    https://zhuanlan.zhihu.com/p/75462046 对于初学者,总是会把度量值和计算列搞混,我也经常碰到这样的问题,有些星友用文章中的代码总是报错,发给我一看,才知道TA把本来 ...

  6. 数据可视化之DAX篇(六) 利用ISINSCOPE函数,轻松按层级计算占比

    https://zhuanlan.zhihu.com/p/70590683 关于占比,之前有篇文章(利用ALL和ALLSELECTED灵活计算占比)详细介绍了各种情况下占比的度量值. 经星友咨询,还有 ...

  7. 数据可视化之DAX篇(二十五)PowerBI常用的度量值:累计至今

    https://zhuanlan.zhihu.com/p/64999937 经常碰到本年至今.本月至今的数据计算,其实还有一类计算是,从历史最早日期至今的累计计算,比如从开业到现在总共卖出了多少件商品 ...

  8. 数据可视化之DAX篇(十五)Power BI按表筛选的思路

    https://zhuanlan.zhihu.com/p/121773967 ​数据分析就是筛选.分组.聚合的过程,关于筛选,可以按一个维度来筛选,也可以按多个维度筛选,还有种常见的方式是,利用几个特 ...

  9. 数据可视化之DAX篇(十一)Power BI度量值不能作为坐标轴?这个解决思路送给你

    https://zhuanlan.zhihu.com/p/79522456 对于PowerBI使用者而言,经常碰到的一个问题是,想把度量值放到坐标轴上,却发现无法实现.尤其是初学者,更是习惯性的想这么 ...

随机推荐

  1. Redis学习笔记(二十) 发布订阅(下)

    当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系. Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面, ...

  2. nsswitch名称解析框架

    name service switch 名称解析框架(逻辑图) 让多种应用程序能灵活进行名称解析的通用框架 与各种类型存储进行交互的公共实现 规定通过哪些途径以及按照什么顺序通过这些途径来查找特定类型 ...

  3. 结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程 目录 结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程 一. 实验准备 二. 实验过程 I 分析中断上下文的切换 ...

  4. python_lesson1 数学与随机数 (math包,random包)

    math包 math包主要处理数学相关的运算.math包定义了两个常数: math.e   # 自然常数e math.pi  # 圆周率pi   此外,math包还有各种运算函数 (下面函数的功能可以 ...

  5. Linux 虚拟机详细安装MySQL

    准备工作 下载MySQL 去官网下载MySQL:点我直达 百度云盘地址:链接: https://pan.baidu.com/s/1qBN4r6t8gvq-I4CFfQQ-EA 密码: hei3 检查L ...

  6. 数据库事务(1)----- JDBC事务与JTA事务

    数据库事务(一)- JDBC事务与JTA事务 本文主要对JDBC事务与JTA事务做一个简单介绍. 1. 数据库事务概念 一个数据库事务通常包含对数据库进行读或写的一个操作序列.它的存在包含有以下两个目 ...

  7. NFC芯片选型及基本电路框架

    RFID作为一项专业度较高的技术,在一些公司,可能还会专门招聘专业的RFID工程师.本篇阐述的涉及到的只是基本选型设计.电路框架,关于RFID天线调试.低功耗检卡调试等,后续再其他篇章会继续更新! N ...

  8. cn.arxiv.org || https://arxiv.org/xxxx 访问失败

    https://arxiv.org/xxxx 访问失败解决方法问题:原论文网址::https://arxiv.org/xxxx 无法访问 解决办法:原论文网址::https://arxiv.org/+ ...

  9. vue全家桶(4.1)

    5.状态管理 5.1.兄弟组件之间共享数据的问题? 首先,我们需要了解下兄弟组件之间如何共享数据的问题 完成下列需求: 1.点击按钮,改变商品数量 2.点击加入购物车,在购物车的这个div盒子里需要显 ...

  10. oracle数据库插入日期格式字符串给date类型字段

    首先执行 alter session set nls_date_format='yyyy-mm-dd  hh24:mi:ss'; 然后执行insert语句而无需使用to_date函数