在任何关于 DAX 的资料里,只会告诉你 DAX 中存在两个上下文:筛选上下文和行上下文,但没有任何资料讲它们为什么要存在。就好像是上帝,说要有光,于是就有了光,那为什么要有光呢?...我们后续会计算展示不同数据结构的使用,但这些仅仅是《Thinking in DAX》的一个部分哦。 计算逻辑 这是本文的重点内容了。...结构,就是因为当你习惯大脑用顺序思考问题时,自然用这种结构很贴合人的思考过程。 DAX 中的分支逻辑 首先,我们要看懂什么是顺序逻辑,如下: ? 在 DAX 中,如何表示分支逻辑呢?...在反复的重复中,这个思维模式会变成自然的习惯,从大脑进入身体内化成自然的身体反应。 接着,大脑思考业务问题,手中流淌出 DAX 公式,如是而已。...本文详细阐述了计算方法中的三大逻辑以及在 DAX 中的实现并本质地揭示了行上下文的运行逻辑,最后给出了大家修炼 DAX 运算能力的建议。
很多人说国内的学习资料太少,在学习的过程中坎坷不断,我与大多数PowerBI学习者一样,一边读外文的博客摸索一边铺路,在不断尝试和与人分享的过程中,总结了个人认为最宝贵的十条DAX学习经验,分享给读者。...而这不同的语境就好比DAX的“上下文”。使用不同的切片器、筛选器、数据透视表的行和列,都会创造不同的“语境”(筛选上下文)。在不同的表中新建计算列,也会有不同的“语境”(行上下文)。 ?...自然而然,度量值、计算列在不同的语境下输出的结果也会不同。这个道理就是“毕竟西湖六月中,风光不与四时同”。懂得了这点,你会少走很多弯路。 ? 所以,第一条经验是,在写公式之前,先理解上下文是什么。...二 使用度量值,而不是计算列 在PowerBI中有三个地方可以写DAX公式:度量值、列、表。这三者理想的使用频率是由大到小,度量值>列>表。 ?...下图这个图是我经常用来脑补DAX的工作原理,度量值和计算列都是先执行筛选再来计算,而所谓的“DAX用作查询语言”其实就是主要应用了筛选功能,所以某些观点“DAX查询将取代数据透视表”是没有道理的,一个东西你只用了一半的功能
DAX 的世界,其实,也非常混乱。为什么用了一个也字呢?读完本文,你就懂了。 正如很多人说自己熟悉 Excel ,但问一个基础问题时: 在 Excel 中,到底什么是表?...在 DAX 中,大概会看到与表相关的概念如下: 表,基础表,基表,表引用,列引用,临时表,表表达式,桥表,计算表,维度表,事实表,中间表,一维表,二维表,汇总表,矩阵表等等。...表引用与列引用 SUM 是一个最基本的函数,本来没有什么好说的。但很快人们会遇到: 这里出现了第一个重要的名词:列引用。...那么 SUM 的准确注解应该是:SUM 的参数,列引用,指向基表中的列,SUM 将对该列的所有数值求和。 随着对 DAX 使用,会继续发现: 此时,会看到:SUMX 的第一个参数叫:表。...其中的列,叫:基列。 明确的概念 根据以上极为严谨的逻辑,我们得到了两个重要的概念: 表(table) ,可以在 DAX 公式中使用的语法元素,它表示一个表结构。
现给出结论:在DAX中不存在真正的SUM。...很多人一定懵了,DAX 在被设计的时候被刻意地与Excel函数的用法做了贴近,而导致PowerBI的运算可以很快入门,但很快就会遇到一个普遍现象:DAX的计算结果和你期望的结果完全不同,而你无法解释为什么...SUM的迷思 从一道经典的问题来看: ? 用户在订单表创建了一个计算列,并写入一个简单的公式,在按下回车的时候,每行的值应该是多少?请思考10秒继续。...真正的原因在于:在DAX中,是不存在SUM的,任何的SUM在计算时都会转化成SUMX。...回到这个问题来看,这里确实不会忽略行上下文,而是将SUM转换成了SUMX,并进入SUMX进行计算,而SUMX将创建新的迭代过程,在表中逐行迭代,进而得到了整列的聚合结果。
常规情况就是这样 那我们再来看下如果不按常规会有怎样的后果 把涉及概念性的操作经常这样反方向尝试,有助于深入理解上下文本质 (一)计算列里使用SUM函数 ?...别急着往下看,自己先思考一下,这个“总销量”的计算列,使用SUM后会出现什么效果 ...... ...... ...... 1. 由于是计算列,所以DAX会自动创建“行上下文” 2....(二)度量值里引用列 在度量值下,直接采用列运算会有什么结果 ? ? 公式栏里,无论是第一种直接引用列,还是第二种表名列名绑定一起,都会出现错误提示 说明在度量值里,这种方式是不允许的 为什么会这样?...因为度量值不会自动创建“行上下文”,而计算列可以,所以在语法源头上就出错了 (三)度量值里使用聚合类迭代函数(SUMX) 从语法上来说,度量值就是由DAX函数构成的,迭代函数也是DAX的一种,自然更没障碍...根据不同的可视化元素,度量值(利润)做出相应汇总 至此,我们再次认识到 ★行上下文”只告诉DAX该使用数据模型的哪一行,任何时候都无法筛选模型,也无法覆盖外层的筛选上下文 ★“筛选上下文”只能依靠报表视图各类筛选器的叠加组合来产生
一个很自然的问题就来了,这个线是否有方程,我们可以让预测按趋势线延长吗? 很可惜这个问题在 Power BI 中是不行的。...最小二乘法 我们发现趋势线的计算在 Power BI 中其实是采用了最小二乘法,那么如果我们可以实现最小二乘法,我们就可以绘制这个趋势线,进而自行去延长了。 下面来详细说明最小二乘法的实现。...感兴趣的伙伴可以自行搜索关于最小二乘法的的求解过程以及更一般化内容,这是一项非常重要的数学发现以及有很强的实用价值。它大致在高中和大学一年级时是标准的教学内容。...给出其 DAX 实现如下: KPI.Forecast.LeastSquaresMethod = // 初始化设置 // 参数 1:原列区间列引用,如:'Calendar'[年份序号] // 参数 2:...如上图所示,没有办法显示趋势线的延长部分,我们使用自行实现的最小二乘法进行修复如下: ? 可以看出,PowerBI 内置的趋势线的确是最小二乘法的实现,这与我们实现的最小二乘法完全吻合。
在关系的一端,列的每一行都必须是非重复的唯一值,并且不能包含空值(注意:空值与空格概念不同,空格也是值)。在关系的多端,相同的值可以在许多不同的行中重复,而且经常如此。...在图 1-5 中,SalesAmount 列中计算的表达式没有引用工作簿中的单元格,而是引用该表的列: ?...你可能认为 Excel 有两种不同的计算方式,我们可以标准引用单元格,单元格 F4 的公式显示为 E4*D4,或者在表中引用列。...在 Excel 中,公式仅在这个表中运行,我们不需要添加表前缀。但是,DAX 需要对数据模型里的许多表进行操作,因此,我们必须特别指明表名(可能不同表中的两列的列名相同)。...因为我们在聚合函数中用了列名称(此例聚合函数为 SUM 函数),这让列名变成一个整体参数,导致 DAX 认为我们要这一列的所有值的总和。
定义计算列的 DAX 公式在表中的每一行分别计算一次。计算结果通常特定于对应的行。原因是,同一表中其他列中的值被用在计算中,而这些值在每行中一般是不同的。...注意,在计算列中直接对某些列进行引用时,只能对当前计算所在的行上的列值起作用,如果要从其他行中检索值,您需要采用完全不同的方法。这与 Excel 中的计算完全不同。...显然,使用 CALCULATE 计算的两个度量值返回了不同的结果。为什么会有这种差异呢?...换句话说:激活另一个关系意味着更改计算的上下文。而改变上下文自然要用到 CALCULATE。 USERELATIONSHIP 函数需要两个参数,是对想要激活的关系的两端的列引用。...更重要的是,在整个度量值的书写过程中,不同位置的上下文可能完全不同,在得到正确结果的道路上往往会出现各种问题。 DAX 变量,使得这类设计高级 DAX 代码的工作变得轻松了不少。
2.Calculate是DAX中最有力量的函数,它可能无处不在,我来带你识别隐藏的Calculate。 ? 什么是上下文?...筛选上下文最容易理解,是纵向的列筛选条件。比如下面的表中销售量2974的筛选上下文是"2016年-第2季度-拿铁",即对日期列和咖啡种类列的筛选。 ? 行上下文,顾名思义,是要横向的看。...在原材料表中新建列[咖啡数量] = sum('咖啡数据'[数量]),结果是每一行都是同一个结果54245。这是为什么呢? ?...以第一行卡布奇诺行为例,在计算咖啡数量时,行上下文是原材料表中的当前行,而计算的公式sum('咖啡数据'[数量])是求数据表中的[数量]列的和。...两者在不同的表中,所以原材料表的行上下文对数据表的计算并没有影响,输出的结果为咖啡数据表中数量列的总计。
所有其他关系位于两个表中具有相同名称的ID列之间。 销售数据可提供许多不同的视图,在同一报表页上为每个视图放置单独的视觉对象会导致报表单一而并非有见地。...在模型中,我们现在辅助表上有一个上下文查询,我们可以使用DAX来确定所做的选择。如果在“代码”列上使用DAX的SUM函数,则二次幂可确保所选项的每个组合对应于代码值的唯一总和。...由于其他日期列中的值可能不同,因此我们需要调整12个月滚动总计的DAX公式以使用正确的日期列。 同样,我们需要一个辅助表来允许我们在日期列之间进行选择。...6.3.1解决方案概述 动态标签与前面讨论的动态度量值之间的根本区别在于,视觉对象中的标签无法通过计算结果填充。相反,标签使用模型中单个列的值。不过,我们要使用的标签来自模型中的三个不同表。...图6.8 辅助轴表 在创建此计算表的公式中,定义了三个DAX变量,每个变量创建辅助表的一部分。以下是第一个变量。
对于一个表的迭代,由于表是行的集合,每一行都表示同类事物的不同个体,如:不同的每一笔订单。很自然地可以将对表的迭代理解为对表中的行集合的迭代。...在遍历的时候一般顺便可以做点坏事,例如,记住遍历过的每个值,这样就有了: SUM.Value = SUM( SomeTable[Value] ) \\ 本质上等价于:SUM.Value = SUMX(...ADDCOLUMNS,迭代时,添加一列,并算出对应行中的元素。 干得坏事是加一列。 因此,我们可以发现:迭代 + 干坏事是不可分割的整体。...因此,在 DAX 中,所有带有需要处理集合中元素语义的功能都是干坏事,都内部包裹了一个看不见的迭代器。 总结 迭代,是很自然的。...记得,在迭代的时候做坏事,不做坏事,DAX 不爱。 祝你玩得开心。
在本章中,我们将简要介绍 DAX 在 Power BI 中的不同用法。 计算列 计算表 度量值 安全筛选器 DAX 查询 除此之外,我们还将讨论如何使用 DAX 创建日期表。...尤其是当您经常使用 Excel,这个操作会非常自然且顺手,因为大多数 Excel 用户借助 Excel 工作时都是直接在列中写公式进行计算。...这与 DAX 和 Power BI 报表的动态特性相悖。 计算列的问题在于,大多数情况下,这些操作属于数据准备层面,或者属于我们在第1章“商业智能中的 DAX”中讨论的五层模型中的“数据预处理”层。...3.7.1 首先考虑使用 DAX 度量值 如果在上文中没有足够地表达清楚,那么容我再重复一边:您的主要 DAX 工具应该是度量值。...总结 在本章中,你已了解 DAX 在 Power BI 模型中的不同用法:计算列、计算表、度量值、安全规则和查询。
数量= SUM('表'[列])//这里我替换成了示例文件 这是我们熟悉了很久的基础代码,聚合。 [1240] 首先缕清思路,求总体占比就是求出当下各品类的数量以及总体的情况进行除法运算。...[1240] 当然,我不光想知道总体占比,我还想知道各个产品在各自所属的类别中是怎么个情况,来,继续: 修改上面的代码如下: 分类占比= CALCULATE('表'[求和项],ALL('表'[类别]))...//这里需要自己替换数据 结果如图: [1240] 很清楚的体现不同名称的销售额在其所属的类别中占比情况。...这里做一下总结: 计算总体占比 DAX= DIVIDE(SUM('表'[求和项]),CALCULATE(SUM('表'[求和项]),ALL('表'))) 计算分类占比 DAX= DIVIDE(SUM('...表'[求和项]),CALCULATE(SUM('表'[求和项]),ALL('表'[项目]))) 计算筛选总体占比 DAX= DIVIDE(SUM('表'[求和项]),CALCULATE(SUM('表'[
严格来说,这两个函数的用途是非常重要的,适用于很多类型的数据,白茶有点搞不懂为什么微软把这两个函数划分为“时间智能函数”。 用途1:可以用来计算数据的非空日期。...语法 语法1: DAX= FIRSTNONBLANK(,) 语法2: DAX= LASTNONBLANK(,) 参数 列:任何列,或者具有单列的表,也可以是表达式。...表达式:计算空值的表达式,也就是判定条件。 返回结果 单列的表,只有一行数据。也就是只返回一个值,只不过这个值在表中。...如果这里不嵌套CALCULATE函数的话,会导致计算忽略计算上下文,只考虑行上下文,那么呈现的结果将是2020年1月3日。...白茶会不定期的分享一些函数卡片哦。 (文件在知识星球PowerBI丨需求圈) [deb49a4b86e7588aed094a6098e341da.png] 这里是白茶,一个PowerBI的初学者。
[strip] DAX,也就是数据模型语言,它一共可以执行八种不同的数据类型。...为什么要说一下可以执行的数据类型?因为这个对于我们的运算逻辑会有影响。比如说:我有一个表,其中的一列是日期,那么这个数据能进行汇总统计么?比如说1月1日+2月1日,结果等于3月2日?...比如:SUM('表'销售金额),这就是一个布尔值,也是计算表达式。 文本:文本函数。比如说:我有一组销售事实表,里面有一列是订单号:2019010112034001。...虽然是纯数字的整数,但是这个订单这个名字能直接计算么?比如使用SUM进行聚合,那出来的结果会是一个无限大数值,也不符合我们的计算逻辑,我可能只是想知道近期的订单成交数量。...这就是DAX函数可以执行的八种数据类型,这里提醒各位小伙伴一声,将数据导入PQ中的时候,一定要对数据的格式进行设置,这个很重要。 好啦,就说到这里。 * * * 小伙伴们❤GET了么?
其用途,常常是用来计算或者显示明面上的筛选影响,而忽略其行上下文的影响。 如果说,CALCULATE函数是DAX中最灵活的函数,那么ALLSELECTED函数就是DAX中最复杂,也是最难的函数。...作为ALL函数系列家族中的一员,它并不像其他ALL系列函数那样,可以称得上是个性鲜明。...语法 DAX= ALLSELECTED([ | [, [, [,…]]]] ) 参数 表:(可选项)不能是表达式,现有表的名称。...列:(可选项可重复)不能是表达式,现有列的名称。 注意:要么是表,要么是列;如果是多列,必须在同一表中。返回结果 不带任何列或行上下文的上下文。...白茶会不定期的分享一些函数卡片 (文件在知识星球PowerBI丨需求圈) [1240] 这里是白茶,一个PowerBI的初学者。 [1240]
低效率的DAX会减慢处理速度,阻塞高级容量,增加等待时间,并妨碍刷新和报告加载时间。 在优化DAX之前清除DAX缓存 缓存由内部VertiPaq查询产生。 从DAX Studio中清除缓存。...对于直接查询,因为Power BI无法检查违规,所以Power BI在列中添加了空白值。...DISTINCT()和VALUES()函数不同: 在整个报表中,保持DISTINCT()和VALUES()函数的用法一致。 如果没有空白值,Power BI建议使用VALUES()函数。...Rows]; Ratio = IF(totalRows > 10, SUM(Revenue) / totalRows,0) 您可以将结果度量值存储在变量中,而不必多次计算相同的表达式。...根据列值使用正确的数据类型 如果一列中只有两个不同的值,请检查是否可以将其转换为布尔数据类型(真/假)。 当您有大量的行时,这可以加快处理速度。
这个问题是一个特别严重的问题,白茶疏忽了,这里补上一下原因:为什么格式书写很重要?...如下: DAX = CALCULATE ( SUM ( '表'[求和项] ), FILTER ( '表', [条件] = "M" ) ) 3.如果函数和参数太多了,那么左括号"("和函数在一行;参数如果是新行...[1240] 下面是今天的示例文件: [1240] [1240] 这是一份服装销售的模拟数据,将其导入PowerBI中,并且输入如下代码,求出销售金额: 销售 = SUM ( '产品表'[销售价] )...这里解释一下含义,IF不多说了,最基础的判定条件;HASONEVALUE函数的定义当列中只有一个唯一值的时候,返回TURE,没有则为空,因为总计栏没有产品名称这一说,所以排名总计消失。...如果不考虑分组、分类这类东西,ALL整个表;考虑分组、分类要ALL具体的列。 [1240] 这是绝对排名,但是有时候我还想知道筛选之后的结果,比如说就几项,该咋整?
你可能认为Excel有两种不同的计算方式:使用标准单元格引用(在这种情况下,单元格F4中的公式应该是E4*D4),或者使用列引用(如果在智能表格中计算)。...使用列引用的优点是,可以在列的所有单元格中使用相同的表达式,而Excel为每行使用不同的值来计算公式。 与Excel不同,DAX只适用于表结构,所有表达式都必须引用表中的列。...在Excel中,不需要提供表名,因为Excel公式在单个表中计算。 但是在DAX中,则需要指定表名,因为DAX在包含多个表的数据模型中工作,来自不同表的两列可能具有相同的名称。...在DAX中,你可以这样写上图所示的AllSales表达式: [AllSales]:= SUM ( Sales[SalesAmount] ) 获取列中特定行的值与将列作为一个整体使用,这两种用法之间没有语法差异...DAX知道你想要对列的所有值求和,因为你在聚合函数(在本例中是SUM函数)中使用了列名作为参数。
因此我将会介绍一个帮助我们使用事件元素来分析数据的关键功能。在PowerBI Desktop 中叫做“time intelligence”。应用这种时域分析法能是商业智能中基本的数据表现形式。...为了更好地理解,我们将介绍如何创建日期表,然后看一下几种不同的分析时间的计算,最后加入这些类型道数据模型中。为了测试我会使用一个excel作为PowerBI Desktop 的文件数据源。...这里你不需要担心是否需要额外的列,因为还可以动态添加你需要的时间元素。 在日期表中引入列排序 现在需要看一下如何排序。典型的例子就是月份排序。...一旦你知道你数据中的最大值和最小值日期就可以使用CALENDAR来生成日期,即使两个值在不同的表里面如下: DateDimension = CALENDAR(MIN('Stock'[PurchaseDate...(MIN('Stock'[PurchaseDate])), ENDOFYEAR(MAX('Invoices'[InvoiceDate]))) 这个公式扩展了DAX的计算,两个计算年的公式也是极其有帮助的
领取专属 10元无门槛券
手把手带您无忧上云