之前的文章(采悟:连接表的几个DAX函数,一次全掌握)介绍了产品A的客户与产品B的客户的各种交叉关系,其中最常用的应该是找出A和B的共同客户,以便进行产品关联分析。

之前的思路是计算出两个产品的共同客户数,那么能不能选择三个产品呢,当然是可以的,利用上篇文章的思路,把三种产品的客户找出来,然后求三个表的交集就可以了。

但是这种方法是不是显得太笨拙了?如果只是两三个产品的共同客户数,勉强还可以使用,但如果是十几个甚至几十个产品,难道要先计算出几十个产品的客户表,再一个个求交集?

DAX当然不会这么笨,本文就给你看一个优雅的解决方案。


以关联分析中的示例数据为例(采悟:PowerBI分析模型:产品关联度分析),当时是利用一个切片和一个表格上下文的方式,来计算两种产品的共同客户数,

下面这个度量值,可以返回任意产品组合的客户数量,

共同客户数量 =
VAR t1 =
GENERATE(
VALUES('订单表'[客户ID]),
EXCEPT(
VALUES('产品表'[产品名称]),
CALCULATETABLE(VALUES('产品表'[产品名称]))))
VAR t2 = SUMMARIZE(t1,'订单表'[客户ID])
VAR t3 = EXCEPT(VALUES('订单表'[客户ID]),t2)
RETURN COUNTROWS(t3)

来看看它的效果,

任意选择多个产品,都可以自动计算出共同客户的数量,这种方式是不是比之前的要优雅的多呢?

再回头看这个度量值的代码,并不长,比上一篇文章中的代码都要短一些,但其理解难度却比那些要高出几个等级。

其中最重要的一个函数就是GENERATE,它的参数很简单,就是两个表,但是封装了强大的计算逻辑。它的这两个参数表,并不是简单的单独计算出来以后再合并到一起。事实上它的第一个参数表的每一行,为第二个表的表达式提供行上下文,在每一行上分别计算第二个表的表达式。

并且这个度量值中,GENERATE的第二个参数的表表达式,其中又使用了VALUES函数和CALCULATETABLE函数,利用它们对行上下文不同的计算逻辑,来最终返回未购买全部所选商品的客户列表。

如果把GENERATE函数彻底弄懂了,你对DAX的掌握,对上下文的理解都可以提升一大步。

这里你如果实在看不懂,也可以先直接用着,回头再慢慢品味。

我整体上再简单解释一下这个度量值,

VAR定义的第一个表t1是最重要的一环,该表返回的是只有两列的表,客户ID和产品名称,每一行组合全是订单表不存在的组合(把t1逻辑搞懂了,你也就理解了这个度量值);

t2将t1表的客户ID提取出来,含义是至少未购买过其中一个所选商品的客户列表;

t3利用EXCEPT函数,剔除t2的客户,就是所选商品的共同客户列表;

最后利用COUNTROWS函数返回共同客户的数量。

是不是仍然很绕呢,不要指望几句话就能帮你理解这个代码,你需要动手去练习,观察它的输出结果,思考上下文的逻辑,这时可以再看一下这篇文章:如何快速理解一个复杂的DAX?

总结

看起来很长的DAX代码并不一定就很难理解,而短的也不一定就很简单。实现同样的业务逻辑,把DAX写的很长并不算很厉害,而知道如何把代码写短,更需要深厚的内功。

优雅的背后,是长期的积累。

数据可视化之powerBI技巧(五)在Power BI中写出优雅的度量值是什么体验?的更多相关文章

  1. 数据可视化之powerBI技巧(二十四)Power BI初学者刚见的错误,帮你轻松处理

    在学习PowerBI的过程中,尤其是刚接触的时候,不可避免的会遇到各种各样的错误,有时自己怎么检查都没法消除,不解决这个错误又没法进行下一步的工作,经常会搞的自己烦闷无比,不过最后通过自己的苦苦摸索. ...

  2. 数据可视化之powerBI技巧(十一)基于SQL思维的PowerBI DAX实战

    本文来自于PowerBI星球嘉宾天行老师的分享,天行老师不仅DAX使用娴熟,更是精通SQL,下面就来欣赏他利用SQL思维编写DAX解决问题的一个实战案例. 基于SQL思维使用DAX解决实战问题 作者: ...

  3. 数据可视化之powerBI技巧(二)Power BI性能分析器,原来还有这个功能

    ​性能分析器是Power BI前几个月推出的功能,主要用于检测视觉对象和DAX的性能如何,该功能的使用比较简单,首先勾选这个功能, 然后点击开始记录并刷新视觉对象,就可以看出每个元素耗费的时间,如下图 ...

  4. 数据可视化之powerBI技巧(二十二)利用这个方法,帮你搞定Power BI"增量刷新"

    Power BI的增量刷新功能现在已经对Pro用户开通,但由于种种限制,很多人依然无法使用无这个功能,所以,每一次刷新,都要彻底更新数据集.这对于量级比较大的数据集来说,着实是一件耗费时间的事情. 拿 ...

  5. 数据可视化之powerBI技巧(十八)Power BI动态技巧:动态显示列和度量值

    今天分享一个可视化小技巧,如何在PowerBI的表格中动态显示需要的列? 就是这样的效果, 也就是根据切片器的筛选,来显示需要的列,做起来很简单,步骤如下: 01 逆透视表 进入Powerquery编 ...

  6. 数据可视化之powerBI技巧(四)使用Power BI制作帕累托图

    各种复杂现象的背后,其实都是受关键的少数因素和普通的大多数因素所影响,把主要精力放在关键的少数因素上,就能达到事半功倍的效果. 这就是大家常说的二八原则,也称为帕累托原则,最早是由意大利经济学家 V. ...

  7. 数据可视化之powerBI技巧(三)这个Power BI技巧很可爱:利用DAX制作时钟

    周末放松一下,给大家分享一个小技巧,仅利用DAX制作一个简易的时钟. 时钟效果如下: 这个时钟的制作只需一个度量值,你信吗? 事实上确实如此,制作步骤介绍如下: 1,新建参数,生成一个数字序列作为小时 ...

  8. 数据可视化之powerBI技巧(二十一)简单三个步骤,轻松管理你的Power BI度量值

    最近碰到几个星友的问题,都是问我之前分享的源文件是如何把度量值分门别类放到不同的文件夹中的,就像这样, 其实在之前的文章中也曾提及过做法,这里再详细说一下制作步骤: 01 | 新建一个空表 点击菜单栏 ...

  9. 数据可视化之powerBI技巧(八)Power BI按多列排序的技巧

    目前PowerBI的表格已经支持多列排序,但是矩阵依然还不支持按多个字段排序,虽然这个需求很普遍,这里利用DAX提供一个变通的实现方式. 模拟数据如下,有两个数据指标: 对类别首先按[指标一]进行排序 ...

随机推荐

  1. FastJson将Java对象转换成json

    确保环境依赖都配置好! 1.在pom.xml导入依赖 <dependency> <groupId>com.alibaba</groupId> <artifac ...

  2. Seafile的配置

    如果部署在apache或nginx后面,就是访问默认80或443.反向代理会帮你转到8000和8082上. 我使用443,我在路由器上设定了转发,比如 对外网12323这个端口会转到内网地址443上 ...

  3. iostst

    原文链接:https://blog.csdn.net/qq_20332637/article/details/82146753 iostat用于输出CPU和磁盘I/O相关的统计信息,iostat 也有 ...

  4. 如何解压bz2后缀的压缩文件

    .bz2 解压1:bzip2 -d FileName.bz2 解压2:bunzip2 FileName.bz2 压缩: bzip2 -z FileName .tar.bz2 解压:tar jxvf F ...

  5. 研华advantech-凌华ADLINK板卡运动控制卡

    研华advantech:6路独立D/A输出12位分辨率双缓冲D/A转换器多种电压范围:+/-10V,+/-5V,0—+5V,0—+10V和4—20mA电流环(汇)16路数字量输入及16路数字量输出 P ...

  6. 一个老牌程序员说:做Java开发,怎么可以不会这 20 种类库和 API

  7. Python变量与基本数据类型

    Python变量与基本数据类型 前言 好了,从本章开始将正式进入Python的学习阶段.本章主要介绍的是Python变量与基本数据类型的认识,这些都是最基本的知识并且必须要牢靠掌握在心中. 注释 学习 ...

  8. js基础练习题(6)

    10.其他 1.选择题 var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Nodei ...

  9. Shader专题:卡通着色(一)控制颜色的艺术

    什么是 Shader? 关于什么是 Shader ,各种百科各种教程都有说过,但是今天我们就从一个另一个角度去试着理解什么是 Shader? 我们先看下 Shade 的英文意思,如下: v.给...遮 ...

  10. oracle闪回,找回已提交修改的记录

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_24521431/article/details/84580166 例如删除ward_id为96 ...