Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >calculate函数更改筛选器,到底是怎么回事儿?|DAX原理

calculate函数更改筛选器,到底是怎么回事儿?|DAX原理

作者头像
大海Power
发布于 2024-01-17 08:48:27
发布于 2024-01-17 08:48:27
56700
代码可运行
举报
运行总次数:0
代码可运行

导语:备,拷,转,调,叠,算,我一遍又一遍地重复这6个字,只为让大家看到一个有calculate函数的公式,尤其是当其结果和自己想的不一样时,可以条件反射式地把这6个步骤应用进去——这是我这一年多来对DAX最重要的总结,没有之一!

在前面一篇文章《想真正掌握CALCULATE函数,千万不要走捷径!|DAX原理》里,我们深入分析了DAX度量公式里“增加筛选条件”的情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.销量_产品B =
CALCULATE(
    [.销量之和],
    FILTER('产品销售表','产品销售表'[产品]="B")
)

今天我们再来深入分析“覆盖筛选条件”的情况,真正搞清楚它的计算过程,以及与增加筛选条件的相同的原理却结果存在较大差异的原因,从而进一步强化对CALCULATE函数的理解!

还是用这份简单数据,即一个产品销售表:

度量如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.B_覆盖 =
CALCULATE(
    [.销量之和],
    '产品销售表'[产品]="B"
)

很多朋友应该都知道它的结果如上图所示,但是否真的完全明白为什么会得到这样的结果,可能就不一定了。

对于初学的朋友来说,一般会直接记住,这种情况就是产品(=B)这个筛选参数会完全覆盖透视表里的产品筛选条件,所以,无论对于哪一个产品,其对应的结果都是B的销量。

学习没有用,除非你真的去用!

又或者再深入一点儿,这个度量的公式是下面公式的简写(语法糖):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.B_覆盖原型 =
CALCULATE(
    [.销量之和],
    FILTER(
        ALL('产品销售表'[产品]),
        '产品销售表'[产品]="B"
    )
)

但是,如果再追问一下:

  • 这个公式到底是怎么计算的?
  • 为什么加个ALL就会覆盖掉?
  • 可以改用FILTER(ALL('产品销售表')...)吗?
  • ALL(表)和ALL(列)到底有什么差别?
  • ……

如果这些问题没有搞清楚,写DAX公式就只能照猫画虎,需求稍有变化,可能就会无所适从了。

下面,我们就用calculate函数的完整计值流——备,拷,转,调,叠,算,还原一下度量[B_覆盖原型]的计算过程,看看和你理解的是否有差别。

第1步:备——准备显式筛选器

这里,在计算“大海/A”的[B_覆盖原型]销量时,虽然filter参数当前的原始上下文是[销售人员]为“大海”,[产品]为“A”,但是,因为filter参数中的第一个参数“ ALL('产品销售表'[产品])”使用了ALL函数,所以,无论什么情况下,都是产品列的所有内容,如下图所示:

然后,filter函数应用其第二个参数([产品]="B")进一步的迭代筛选,因为“ ALL('产品销售表'[产品])”得到的始终是所有产品,所以经过筛选后,无论外部的筛选器是什么,这里都得到产品为“B”的结果

注意——

这就是filter参数里使用ALL和不使用ALL的差别!而这项差别是导致最终结果差别的最关键原因。

第2步:拷——拷贝原始上下文

这里的原始上下文即透视表的两项:销售、产品,如在计算“大海/A”的销量时,“销售”筛选器的当前值为“大海”,而“产品”筛选器的当前值为“A”。

第3步:转——将行上下文转换为筛选上下文

这里没有行上下文,所以没有触发这个步骤的相关过程,跳过不用管。

第4步:调——调节器调整上下文的影响行文

这里没有调节器,所以这个步骤也跳过不用管。

第5步:叠——应用第1步结果叠加到第2/3/4步筛选器

到了这里,filter参数得到产品为B的筛选器,再次和透视表的筛选器(即第2步拷贝下来的销售、产品两个筛选器)产生作用。

因为filter参数的筛选器——产品,和从透视表中拷贝下来的产品筛选器一致,所以,会直接“覆盖”掉产品筛选器。

注意,是第1步准备的同名筛选器产品B“覆盖”原来的值,所以结果为B的销量,而不是因为取了“交集”!——如果取了交集,这里就应该为空了!

同时,这里因为只是对产品这个筛选器做了处理,所以,对于拷贝下来的“销售”筛选器则没有任何影响。

大家可以试着将“ ALL('产品销售表'[产品])”改为“ ALL('产品销售表')”,然后分析一下这个计算过程和结果,去理解一下ALL(表)和ALL(列)的差别。

第6步:算——基于第5步最后的筛选器计算结果

这一步就只是计算了,根据最后的筛选器结果代入计算即可。

最后,汇总整个计算过程如下图所示:

建议大家按照这个完整过程,分析一下“小勤/C”的计值流。

不好意思,这个文章我又重复了一遍“备,拷,转,调,叠,算”,希望不会让大家觉得烦,我一遍又一遍地重复这6个字,只为让大家看到一个有calculate函数的公式,尤其是当其结果和自己想得不一样时,可以条件反射式地把这6个步骤应用进去。

回想我反反复复对Calculate函数一次又一次感觉学会又不断推翻理解的过程,最后总结出来这6个字,才真正随着对这6个字含义及影响的理解越来越清晰,才得以在面对不同的需要时,自然而然地想到用哪一个字哪一种方式去应对,从而顺利地写出正确的度量公式。

学习是起点,实践是路径,应用是目的,这,也许就是从学、到练、到用——学以致用,活学活用的关键过程吧!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel到PowerBI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
这个案例彻底理解USERELATIONSHIP,还能加深CALCULATE的理解!|DAX核心
导语:USERELATIONSHIP函数本身很简单,但经常需要和CALCULATE函数结合使用,这时,问题就开始变得很复杂,而反过来说,通过理解USERELATIONSHIP参与计算的过程,也能加深对CALCULATE函数的理解。
大海Power
2024/05/11
7981
这个案例彻底理解USERELATIONSHIP,还能加深CALCULATE的理解!|DAX核心
CALCULATE函数这个带行下文的简单公式,可能90%的人都没搞懂怎么算的! | DAX实战
一个使用了CALCULATE函数的公式,到底是怎么样计算得到它的结果的?如果没有真正搞懂CALCULATE函数计值流(计算过程)的话,即使这个公式很简单,也可能会无法理解!
大海Power
2022/05/25
1.9K0
CALCULATE函数这个带行下文的简单公式,可能90%的人都没搞懂怎么算的! | DAX实战
关于Calculate函数,筛选条件参数按什么顺序写? | DAX实战经验
前些天,我写了文章《关于CALCULATE函数,初学者特别容易混淆的问题之一!| DAX实战案例》,其中涉及关于“工设总工时”的计算,写了公式如下:
大海Power
2022/05/25
1.1K0
关于Calculate函数,筛选条件参数按什么顺序写? | DAX实战经验
Extreme DAX-第4章 上下文和筛选
编写 DAX 公式时要掌握的核心概念是上下文。DAX 作为一门动态数据分析语言,与 Excel 函数、SQL 查询 和 Power Query 脚本有着根本不同的原因就在于上下文的概念。以上所述的所有其他语言的公式只会在数据发生变化时才会返回不同的结果(除了一些例外情况,例如使用参数时),但是单个 DAX 公式就可以同时提供多个不同的结果,具体取决于您使用它的位置和方式,也就是:上下文。
陈学谦
2022/05/24
6.1K1
Extreme DAX-第4章 上下文和筛选
DAX进阶-死磕Calculate之1:改变筛选上下文之忽略(”删“)
小勤:在文章《DAX入门:无动态,不智能——谈谈DAX函数的计算环境(筛选上下文)问题》里提到,默认情况下度量的计算是随着计算环境(筛选上下文)的选择而动态变化的,但有时候就是需要一些不变的情况,那怎么办?
大海Power
2021/08/30
1.3K0
Calculate计值流,DAX最重要知识点,没有之一!
1、为什么先写好度量[最大日期],然后在Calculate的筛选条件里调用,却不能得到正确的结果呢?filter是行上下文应该不具备筛选功能?
大海Power
2021/08/31
2.1K0
Power BI:在DAX中转移筛选器
文章背景: 最近在学习DAX权威指南的第15章,高级关系。在某些情况下,我们很难在两个实体之间创建物理关系。可喜的是,DAX表达式有多种方式模拟这种关系。
Exploring
2023/09/24
6100
Power BI:在DAX中转移筛选器
DAX中的基础表函数
👆点击“博文视点Broadview”,获取更多书讯 本文将介绍DAX中的基础表函数。 表函数是DAX中的一种常规函数,它返回的结果不是一个标量值,而是一个表。当需要编写DAX查询和迭代表的高级计算时,表函数非常有用。本文会介绍相关的计算示例。 本文的目标是介绍表函数的概念,而并非提供所有DAX表函数的详细说明。 《DAX权威指南》一书的第12章和第13章中介绍了更多的表函数。本文将解释DAX中最常见和重要的表函数的作用,以及如何在常见的场景中,包括标量表达式中使用它们。 01 表函数介绍 到目前为止,你
博文视点Broadview
2023/05/06
3.1K0
DAX中的基础表函数
DAX进阶-死磕Calculate之2:改变筛选上下文之选择性忽略
小勤:大海,上次将Calculate改变筛选上下文,忽略(删)现有筛选器的作用时,都是整个表或整个字段都不起作用了,如果我只是希望忽略某个字段中的一部分内容呢?比如下面这个,我想看看某个产品在我选择的产品中的销量占比(如数据透视的父行汇总百分比):
大海Power
2021/08/30
8860
关于CALCULATE函数,初学者特别容易混淆的问题之一! | DAX实战案例
DAX里的CALCULATE函数,无疑是最强大、最重要、最灵活而又最难懂的函数,没有之一。
大海Power
2022/05/25
1K0
关于CALCULATE函数,初学者特别容易混淆的问题之一! | DAX实战案例
Power BI: 理解上下文转换
Calculate是目前DAX语言中最重要、最有用同时也是最复杂的函数,值得单独成章进行介绍。涉及Calculate函数的内容很多,这里介绍的是行上下文转换。
Exploring
2023/08/17
1.5K0
Power BI: 理解上下文转换
PowerBI公式-Filter函数
度量值工作的两大核心步骤是筛选和计算,筛选函数是制定计算的范围,聚合函数的用途是计算。如果你能够领悟第一阶段学习的筛选和聚合共10个函数以及上下文的概念,你就掌握了度量值和DAX的精髓。左手漏斗筛选器,右手智能计算器,随心所欲的设计你的筛选和计算,Master of Power BI指日可待。这一节我们就来学习最强大的筛选函数Filter。
公众号PowerBI大师
2019/08/07
7K0
PowerBI公式-Filter函数
上下文系列小讲堂(回顾1)
创建行上下文 1. 计算列:引用原有列,通过计算生成新列 2. 迭代函数 1) 聚合函数+X结尾:SumX,AverageX,CountX,CountaX,MaxX,MinX 2) 其他迭代函数:Filter,RankX,SelectColumns,AddColumns,ConcatenateX,FirstNONBlank / LastNONBlank,FirstNONBlankValue / LastNONBlankValue,ProductX
公众号PowerBI大师
2020/08/11
1.1K0
上下文系列小讲堂(回顾1)
PowerBI公式-Calculate最强大的函数
从Calculate的语法结构我们可以看出它能够把计算表达式和筛选条件整合起来。我们前面把度量值比作带着漏斗的计算器,那么Calculate就是漏斗与计算器之间的启动键,它能够赋予漏斗按指定的条件来执行过滤筛选,同时让计算器执行运算。
公众号PowerBI大师
2019/08/07
7.9K0
PowerBI公式-Calculate最强大的函数
DAX进阶-ALL函数的理解雷区!
在文章《死磕Calculate之1:改变筛选上下文之忽略(”删“)》里,我说“把筛选上下文给去掉(删),用All函数”,如下所示:
大海Power
2021/08/30
8920
2.8 PowerBI数据建模-理解上下文(计值环境)
加入 PowerBI自己学 知识星球 可以:下载源文件,边学边练;遇到问题,提问交流,有问必答。
PowerBI自己学_轻松
2025/02/24
1940
2.8 PowerBI数据建模-理解上下文(计值环境)
一个度量,是怎样炼成的? | DAX重要思路
前面,我在文章《DAX的核心,其实只有4个字!》里提到,DAX核心思想,就是“筛选、计算”四个字,当然,这个总结非常抽象,接下来,我会用一个又一个的例子来给大家具体讲,大家将慢慢体会到,几乎所有的度量都紧紧围绕这个思想而展开。
大海Power
2022/04/11
7180
一个度量,是怎样炼成的? | DAX重要思路
Power BI: 理解ALLSELECTED函数和影子筛选上下文
ALLSELECTED函数是唯一一个使用影子筛选上下文的DAX函数。我们首先研究ALLSELECTED的行为,然后介绍影子筛选上下文。
Exploring
2023/09/10
2.2K0
Power BI: 理解ALLSELECTED函数和影子筛选上下文
DAX学习分享:十条经验
很多人说国内的学习资料太少,在学习的过程中坎坷不断,我与大多数PowerBI学习者一样,一边读外文的博客摸索一边铺路,在不断尝试和与人分享的过程中,总结了个人认为最宝贵的十条DAX学习经验,分享给读者。
公众号PowerBI大师
2019/08/07
3.5K0
DAX学习分享:十条经验
Power BI:优化筛选条件
1 定义优化策略2 优化DAX表达式中的瓶颈2.1 优化筛选条件2.1.1 优化前2.1.2 优化后2.1.3 小结
Exploring
2023/11/27
4930
Power BI:优化筛选条件
相关推荐
这个案例彻底理解USERELATIONSHIP,还能加深CALCULATE的理解!|DAX核心
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验