2 使用TREATAS函数转移筛选器 首选的也是最好的做法是,使用TREATAS将Advertised Brands表的筛选器转移到其他表上。...借助TREATAS,我们可以改变Advertised Brands表的数据沿袭,使其可以作为CALCULATE的筛选器参数,并将其筛选器作用于整个数据模型。...Sales表需要同时接收来自视觉对象的筛选器(可能只筛选一年或一个品牌)。 这个版本的写法比使用迭代的版本要好得多。...3 使用INTERSECT函数转移筛选器 获得相同结果的另一种做法是使用INTERSECT函数。...4 使用FILTER函数转移筛选器 DAX开发人员还有第四种选择:使用FLILTER和CONTAINS。
导语:备,拷,转,调,叠,算,我一遍又一遍地重复这6个字,只为让大家看到一个有calculate函数的公式,尤其是当其结果和自己想的不一样时,可以条件反射式地把这6个步骤应用进去——这是我这一年多来对DAX...|DAX原理》里,我们深入分析了DAX度量公式里“增加筛选条件”的情况: .销量_产品B = CALCULATE( [.销量之和], FILTER('产品销售表','产品销售表'[产品]...第1步:备——准备显式筛选器 这里,在计算“大海/A”的[B_覆盖原型]销量时,虽然filter参数当前的原始上下文是[销售人员]为“大海”,[产品]为“A”,但是,因为filter参数中的第一个参数“...第2步:拷——拷贝原始上下文 这里的原始上下文即透视表的两项:销售、产品,如在计算“大海/A”的销量时,“销售”筛选器的当前值为“大海”,而“产品”筛选器的当前值为“A”。...因为filter参数的筛选器——产品,和从透视表中拷贝下来的产品筛选器一致,所以,会直接“覆盖”掉产品筛选器。
问题重现 如果你使用 DAX 很快就会发现总计行的问题。例如: Topic.Problem = // 这个度量值的总计行会有问题 [KPI] + 1000 出现错误的情况: ?...为了把这个问题揭露得更加彻底,让我们来彻底地吐槽出来先: 总计 = 以上各行全部的和 小计 = 在本区间内各行的和 如果用户做出了部分筛选,总计和小计的计算也应该是正确的 能同时满足上述三项的才是好方法...DAX 的强大就在于灵活的上下文,尤其是筛选上下文。而出现的总计行问题也是由总计行引发的。...值得一提的是,这里的 产品[类别] 和 客户[分类] 是一个多对多的复杂关系,但也被轻松化解了。完全一模一样的套路。...总结 通过本文我们彻底给出了一以贯之的 DAX 计算套路,它实现了如下特点: 可用于元素行计算 可用于小计行计算 可用于总计行计算 满足外部所有筛选有效 可以应对单列分组 可以应对多列分组,同表 可以应对多列分组
往期推荐 如何在矩阵的行上显示“其他”【1】 如何在矩阵的行上显示“其他”【2】 正文开始 上一篇文章的末尾,我放了一张动图: 当年度切片器变换筛选时,子类别中显示的种类和顺序是不相同的,但不变的是...再次,年度切片器变化时,不同的子类别对应的数据变化,而我们说数据表在建立的那一刻起就是固定的,除非再次刷新,否则切片器不会改变原数据。...那么我们基本上可以得出结论了:数据表是由子类别和年度组合构成,把每年的子类别对应的销售额放进去,通过筛选年度切片器,达到选择不同年份时显示不同的销售额。 我们根据以上的思路试着来建立模型。...同样,按照其他的列进行排序,也是会得到同样的结果: 事情好像无法往下进行了。 但是铁人王进喜有句名言:“有条件要上,没有条件,创造条件也要上。” 我们再重新审视一下这个按列排序的错误。...我们来看一下效果: 这样基本达到了本文开始的要求: 当年度切片器变换筛选时,子类别中显示的种类和顺序是不相同的,但不变的是: ①others永远显示在最后一行 ②显示的10个子类别按照sales或sales
当你跨过了经常犯一些低级错误的菜鸟阶段(如不知道要使用哪些 DAX函数、语法不正确或忘记括号等)之后,你在使用 DAX 时可能要天天和上下文打交道。...定义计算列的 DAX 公式在表中的每一行分别计算一次。计算结果通常特定于对应的行。原因是,同一表中其他列中的值被用在计算中,而这些值在每行中一般是不同的。...除此之外,如果此表与其他表之间存在关系,则这些关系将会传递这些筛选,此时我们也得到在其他表中由被筛选的行所构成的子集。...只有当筛选器来自于使用度量值的视觉对象中的标签时,ALLSELECTED 才会删除这些筛选器。而来自切片器、页面筛选器或其他视觉效果的外部筛选器则保持不变。...为了能够被用作筛选器,DAX 引擎应该能够识别虚拟表是否连接到模型中的表或某些列。这种连接称为数据沿袭(Lineage),简而言之,这意味着在创建虚拟表时,DAX 会跟踪虚拟表中列的来源的原始列。
在小黄书上,有个关于calculate函数的入门例子,通过all函数删除销售人员维度的影响,得到结果的同时,又带来一个问题如下: 问 筛选上下文是小勤和A产品,删去小勤这个筛选上下文,还留一个A产品,那...而随着学习和应用的深入,比如开始接触到DAX里一个比较“高阶”的知识点:AutoExist(自动匹配),这个问题就会迎刃而解: 答 DAX里为了提升计算效率,对于不可能存在的组合(同一个表里),会直接在度量计算开始时予以剔除...比如,产品和销售两个维度分别从不同的维度表与销售明细表关联,模型如下图所示: 在这种情况下,这两个维度完全有可能存在组合(不能因为明细表中可能不存在而剔除,因为现在没有,以后可能有;明细表中没有,其他关联表中可能有...| DAX疑难点》,有兴趣的朋友可以深入了解一下,初学的朋友可以先有个简单的印象。...同时,对于DAX的学习,提供一点点建议如下: 1、初学者在学习基础的过程中,一般也可以不要陷在这些原理和细节的处理上,可以适当先加入点记忆; 2、在实际工作中先用起来,很多细节在实际工作的计算中不太会遇得到
这类构造可能用到大量 DAX 特性以及函数,包括但不限于:筛选上下文,行上下文,上下文转换,DAX查询,VAR,EARLIER,SUMX,RANKX,TREATAS,{ },按列排序,CALCULATE...; 五、矩阵的单元格背景颜色可以是任意的,如:按照某种规则设置(且支持透明度),普通,小计,合计; 六、矩阵的单元格字体颜色可以是任意的,如:正负的不同颜色等; 七、矩阵的单元格数字格式可以是任意的,如...:千分位整数,百分比,小数等; 八、矩阵行的排序可以是任意的,如:按照销售额大小对行排序,但其他,小计,合计总在最后; 九、矩阵的计算是全动态的,如:切片器和其他图表可以交叉筛选该矩阵; 十、矩阵的数字是可以导出的...这也是 PowerBI DAX 有别于其他商业智能软件的根本所在。PowerBI 本身并没有一个官方说明来描述如何构建中国式复杂矩阵,因此,我们需要探索并寻求一套解决方案。...全网首发《PowerBI 全动态中国式复杂矩阵完美版》史称 v3.0 2021-01-08 BI佐罗 全网首发《PowerBI 全动态中国式复杂矩阵完美增强版》史称 v4.0 你没有看错,完美的阶段已经被超越了
PowerBI Desktop 本月更新中有几个亮点,先来看看主要内容包括: 界面风格更新 可视化筛选器支持切片器 性能分析器支持排序 条件格式支持更多可视化控件 DAX设置 背景色 及 可视化头部颜色...DAX设置 卡片图 颜色 DAX设置 仪表图 颜色 可视化元素头部支持工具提示 表和矩阵支持自定义小计名称 同步切片器支持层级切片器 不同可视化对象的字体统一 加入新的DAX运算符 新的可视化 增强的...可视化筛选器支持切片器 性能分析器支持排序 当一个界面很复杂的时候,就可以快速定位到用时长的元素进而进行优化了。 条件格式支持更多可视化控件 DAX 设置颜色开始支持越来越多的元素和可能。...DAX设置 背景色 及 可视化头部颜色 DAX设置 卡片图 颜色 DAX设置 仪表图 颜色 可视化元素头部支持工具提示 这样,对于任何可视化元素,都可以描述其作用了,例如: 表和矩阵支持自定义小计名称...用户可以直接在PowerBI Desktop中使用认可的数据集,如下: 就可以看到: 不难注意到刚刚【已升级】的数据集被优先给出了,而其他数据集都是本人可以使用的。
DAX 安全筛选器 创建安全角色后,就可以定义该角色的实际安全策略了。我们可以在模型中的一个或多个表上声明 DAX安全筛选器。...请注意,DAX 安全筛选器通过角色和表来声明,我们可以在同一个表上具有不同的安全筛选器,只要它们具有不同的安全角色即可。 DAX 安全筛选器确定此安全角色中的用户将在表中看到哪些行。...使用独立的UserSecurity表时,你需要从表中检索用户ID作为DAX安全筛选器的一部分。例如,为了保护Employee表,DAX 安全筛选器应设置为如下所示。...仅当UserSecurity表与其他表无关时,这才有效,因为不应将此筛选器传递到模型的其余部分。 请记住,安全筛选器是同时应用的,因此不会相互依赖,就像CALCULATE函数中的筛选器参数一样。...当涉及到度量值的计值上下文时,这的确没问题,但对于安全筛选器则不是这样。 实际上,发生这个错误你应该感到庆幸,因为我们正在尝试做的是删除或更改fHours表上的安全性。
我们拖拽一个切片器如下: 现在问题来了,如果点击 全选 或 全不选(点击两次全选即可切换为全不选)会是什么结果。在看答案前,很多人或猜测: 猜测全选时,返回 TRUE,对吗?...直接全选与直接全不选等价,没有选择任何元素,也就是某列没有被筛选。 清除选择回到初始状态,没有选择任何元素,也就是某列没有被筛选。 逐个选择直至全选,选择了所有元素,某列被筛选。...其状态变化图如下: 再仔细观察下 PowerBI 的切片器控件,如下: 识记 DAX 函数 将上面的经验与 DAX 函数结合,便可以得到这样的准确用词以及规律: 无函数,对应于【初始化】,无筛选,ISFILTERED...,因此,是被筛选的。...总结 至此可以得到非常清晰的识记方式: ALL - 全选,与全不选以及清除筛选等价。 当 ALL 位于 FILTER 等函数内时,全选后再被迭代判断而筛选,因此,是被筛选的。
在某一时刻,如果关系再次变为有效,比如你将银色产品添加回去,那么空行将从报表中消失。 DAX中的某些函数将空行作为其结果的一部分,而其他函数则不会这样做。...然而,在处理无效的关系时,你需要注意这种情况,否则可能会编写出错误的表达式。...ALLSELECTED函数在检索表或列的值时非常有用(这类值的特点是在当前报表中可见),并且只考虑当前视觉对象之外的所有筛选器。...图19 使用ALLSELECTED函数,在基于销售额计算百分比时只考虑外部筛选器 总计恢复为100%,报表的数字反映的是占可见总计(Visible Total,即只考虑除当前视觉对象之外的所有筛选器...这里所说的意外的结果并不是指错误的结果,而是指经验丰富的DAX开发人员也难以理解的结果。 在本章介绍的表达式中使用ALLSELECTED时,它是特别有用的函数。
一 理解上下文 学习DAX的难点在于理解上下文概念,一旦想通了这个,就好比打通了任督二脉,青云直上。只是这个概念被一些计算机专业词汇搞得妖魔化了,然而究其本质极其简单。...而这不同的语境就好比DAX的“上下文”。使用不同的切片器、筛选器、数据透视表的行和列,都会创造不同的“语境”(筛选上下文)。在不同的表中新建计算列,也会有不同的“语境”(行上下文)。 ?...计算列不是什么新知识,就好像在Excel中使用Vlookup添加一列一样,这一列是基于现有的表基础上做运算,它是“静态”的,运算结果不会因为切片器或透视筛选而变化,当你建立好后,它就会保存在文件中,增加你的内存...下图这个图是我经常用来脑补DAX的工作原理,度量值和计算列都是先执行筛选再来计算,而所谓的“DAX用作查询语言”其实就是主要应用了筛选功能,所以某些观点“DAX查询将取代数据透视表”是没有道理的,一个东西你只用了一半的功能...第一时间到编辑查询器和建模界面中,去检查数据类型、格式、分类的设置是否正确。这往往是无意识发生的错误,即便是PowerBI高手。
在任何上下文中引用度量值时,因为引用的度量值在CALCULATE函数内部执行它的DAX代码。 3 计算列中的上下文转换 3.1 简单应用 单层行上下文的转换非常直观,相信都能理解。...(2)对第二个度量值来说,因为ALL函数返回了全部订单号与产品形成的表,当发生行上下文转换时将得到两个筛选器,一个是订单号的筛选器,另一个则是产品的筛选器,那么在与外部的行标签提供的产品筛选器交互时,转换而来的产品筛选器将覆盖行标签的产品筛选器...所以很多人都错以为多层行上下文嵌套时的行上下文转换是仅转换最内层的行上下文,这个理解方式是错误的。...(1)行标签提供了一个产品名称的筛选器,然后VALUES被其筛选,返回相应的产品代码,此时如果FILTER第二参数为真,那么VALUES返回的产品代码将成为CALCULATE的内部筛选器并与行标签的产品名称筛选器相交...(4)经过上面的梳理,已经成功找到了这个错误写法之所以错误的原因了,那就是FILTER第二参数恒成立了,达不到筛选的效果,但最根本的原因其实还是MAXX函数在迭代过程中无法找到所有产品的最大值,因为其受到了行标签提供的产品名称筛选器的影响
在 PowerBI DAX 中,为了简化,数据结构只有一种表面形态:表。那当需要按照不同逻辑结构思考问题的时候,如何从表的结构形态衍生出其他结构形态? 将表作为表 将表作为表,是很自然的。...表与值的转化 在参与运算时,若某个表中只有一行一列,则可以被作为值。 这里常用的一个 DAX 函数有:VALUES,这用来从一个表中提取一列(会自动非重复化),例如: ?...当VALUES函数直接用于度量值时,DAX 引擎仅仅检查语法,是没有错误的;但只有在用户使用该度量值的运行时,才会真正计算,得到了含有多个值的结果(也是一个表),且提示用户:表中应该具有单个值。...即:正在计算的当前的产品所在行,会转换为对某个产品的筛选作用于整个数据模型进行对[KPI]的计算。可以直观地想象成:在迭代每个产品时,在当前产品,向下捞取对应的订单计算。...总结 在 DAX 中,常见的数据结构有四种: 作为表(Table)的表,常常与其他表通过关系构成更复杂的结构。
下载微软官方示例文件 PowerBI 每月更新,微软官方提供一个示例文件,我们基于该文件来进行介绍,与微软官方保持一致,为了便于理解,在需要时我们采用其他案例进行说明。...在制作 PowerBI 报告时,尤其是在线版的报告,需要报告级、页面级以及可视化对象级不同的筛选器来实时完成某些筛选,该特性会非常使用,尤其适用于场景:从多个元素(元素个数大于10)中选择一部分。...折线图支持筛选单点或某个系列并交叉筛选其他可视化对象 现在可以选择折线图的某个点,如下: 或者可以选择某个系列,如下: 并同时起到交叉筛选其他可视化对象的作用。...可视化交互可默认设置为筛选 此前的默认视觉交互是突出显示,而本次更新提供了设置为交叉筛选,这项其实更加实用: 当点击一个视觉对象时,将交叉筛选其他视觉对象,如下: 分析功能改进 本次更新带来了几处重要的分析功能改进...改进的PY和R的编辑器 喜欢使用PY或R的战友现在可以使用与DAX一样的编辑器功能了: 包括智能提示以及编辑器行号,放大缩小等特性。
在本章中,我们将简要介绍 DAX 在 Power BI 中的不同用法。 计算列 计算表 度量值 安全筛选器 DAX 查询 除此之外,我们还将讨论如何使用 DAX 创建日期表。...但是,与计算列相反,计算表不会与模型的其他元素紧密耦合。当你删除那些与计算表相关的用于计算的列或表时,您将收到错误提示;但是只要再次添加这些表或列,这些错误也就没了。...我们将在第4章 “上下文与筛选”中详细讨论这些概念。 3.4 DAX安全筛选器 DAX 还可用于在 Power BI 模型中实现安全性。当用户检索报表时,他们将能够通过该报表查看模型提供的所有结果。...Customer[Region] = "Europe" 为特定安全角色设置时,此 DAX 安全筛选器将使该角色中的用户只能查看欧洲区域中的客户以及与这些客户相关的数据。...下一章将介绍的可能是使用 DAX 时要理解的最重要的概念:上下文和筛选。之后,我们将整装待发,一起去探索第二部分的高级 DAX 业务案例。
反思 首先,这个问题,让我们对 DAX 计算再次反思: DAX 计算从本质来讲,永远发生在模型层。...请大家仔细观察上述两种模式的实际 DAX 公式,便可以发现视图层计算往往具有两大重大优势: 1、已经计算完毕的内容由于往往可以得到缓存而使得后续计算更快; 2、已经计算完毕的内容不会再收到筛选上下文等复杂逻辑影响...这便是对 DAX 计算的反思。...2、若 PowerBI 将视图层计算功能融入到 DAX 中,将导致作为纯模型层计算的函数库 DAX 掺杂了其他内容而使得 DAX 不再纯粹,这也是不希望发生的。...本案例在计算按名称累计时,使用了一个非常有创意的技巧:SELECTEDVALUE( Customer[Occupation] , "座座座座" ) 默认返回"座座座座",将作为中英文世界的词语几乎是最大字符而使得在小计行或总计行可以完成正确的计算
若将产品名称的数量放入报表,可获得每年销售的产品数量,因为通过 Sales 销售表的关系传递,Product 产品被相应的年份所筛选。...因为日期表和销售表是单向关系,颜色列的筛选并没有传递到日期表。因此,尽管销售表已经被筛选,单向关系类型导致该筛选不能传递至 Date 表。...DAX需要的理论 我们需要明确的事实:DAX 首先需要学习的,不是它和其他编程语言有何不同,而是思维模式的转变。遇到一些待解决的问题时,你可能已经习惯在网上找复杂的公式和解决方案去解决。...而 DAX 的叶级计算速度非常快,不过 DAX 的聚合有其他的用途,且仅对大型数据集有效。因此,在搭建数据模型时,需要一些观念的转换。...当你认为自己掌握了所有东西时,请再次阅读本书。您会发现当您对内容有了更为深入的理解时,之前许多看似不那么重要的细节将会有更深刻的内涵。 好好享受本书的其他部分吧! ?
注意:当前产品子类别没有被筛选。 记住这个数字:905,表示两个产品大类别下的产品数。...不难看出: 在 Power BI 中使用任何图表都会自然的触发条件 2,而用户的确常常会做切片器,而且来自同一个表的不同的列,那么,也很容易触发条件 1,这样一来,这个叫 AutoExist 的机制是很容易被触发的...通过观察 DAX 公式,以及触发了 AutoExist 产生的问题,可以总结到:如果在公式中有 ALL 掉某表一部分列且报表中有来自该表的多个列的筛选时则可能触发此问题。...(如:清除,常常使用 ALL)某表一部分列筛选 报表中有来自该表的多个列的筛选 则 AutoExist 特性在后台自动运转时可能导致诡异的计算结果,称此为:AutoExist 问题陷阱。...只需要记忆: DAX 有个陷阱叫:Auto 啥的来着。 当一个表有两列分别作为切片器时又写了一个 DAX 公式里 ALL 掉了其中一列。 数字就会不对。 解决方法是:把那列单独做个表出来即可。
接下来,我会继续用更多的例子,力求为到家拨开DAX的一些迷雾。 - 案例/问题 - 今天的例子比较简单——分别用计算列和度量两种方式,对编号进行模糊匹配:返回被非标准编号包含的标准编号。...前面的文章《DAX的核心,其实只有4个字!》里我讲过,DAX的核心思想,其实非常、非常简单,就四个字“筛选、计算”!...- 思路/解法 - 回到这个例子,我们先看计算列的写法: 筛选 显然,就是用包含判断的方法(FIND),从标准编号里筛选(FILTER)出被当前非标准编号包含的数据。...首先,写度量,我们要看这个度量的结果放在什么样的环境(切片器/筛选条件等)下用?...最后再啰嗦一下,在基本掌握DAX的基础知识和常用函数的情况下,写DAX公式时,一定要谨记“筛选、计算”这个核心思路,确保思路清晰而不是一团乱麻——关于这个思路更加具体的应用,
领取专属 10元无门槛券
手把手带您无忧上云