零基础认识DAX: 语法、函数、上下文
DAX中三个非常重要的基础概念:“语法”、“函数”和“上下文”。当然,DAX 中还有其他重要概念,但了解这三个概念将为您增强 DAX 技能提供最佳基础。
语法
在创建公式之前,让我们先来了解 DAX 公式的语法。语法包括组成公式的不同元素,或者更简单地说,就是如何编写公式。
先看一个计算列的公式:
此公式的语法包括以下元素:
A: 等号运算符 (=) 指示公式的开头,当计算此公式时,它将返回结果或值。用于计算值的所有公式都将以等号开头。
B: 引用列 [SalesAmount] 包含我们要从中减去某个值的值。公式中的列引用始终由方括号 [] 括起来。与引用单元的 Excel 公式不同,DAX 公式始终引用列。
C: 减 (-) 数学运算符。
D: 引用列 [TotalCost] 包含我们要从 [SalesAmount] 列的值中减去的值。
在尝试了解如何解读 DAX 公式时,将其中每个元素分解为您日常思考和说话所用的语言通常会很有用。例如,您可按如下方式解读此公式:
在 表中,对于 Margin 计算列中的每一行,通过从 [SalesAmount] 列的值中减去 (-) [TotalCost] 列中的值计算出 (=) 一个值。
下面看一下另一种类型的公式, 用于度量值:
此公式包括以下语法元素:
A: "总销售额" 的度量名称总和。度量值的公式可以包含度量值名称, 后跟冒号, 然后是计算公式。
B: 等号运算符 (=) 指示计算公式的开头。计算后,它将返回结果。
C: SUM 函数累加 [SalesAmount] 列中的所有数字。和Excel中的意义一致。
D: 括号 () 括起一个或多个参数。所有函数都要求至少一个参数。一个参数向函数传递一个值。
E: 引用表 FactSales。
F: FactSales 表中的引用列 [SalesAmount]。通过此参数,Sum 函数可了解对哪一列累加以生成 SUM。
可按如下方式解读此公式:
度衡量"销售额总和","计算 (=)" 表 FactSales中的 "[SalesAmount]" 列中的值的总和。
当放置到上下文,比如矩阵中时, 此度量计算并返回数据透视表中的每个单元格定义的值, 例如 USA 中的手机。
请注意,此公式与前面我们用于 Margin 计算列的公式相比存在一些不同点。尤其是,我们引入了一个“函数”:SUM。函数是预先编写的公式,旨在更轻松地对数字、日期、时间、文本等执行复杂的计算和操控。稍后您将了解有关函数的详细信息。
与之前的毛利计算列不同, 你将看到列 [SalesAmount] 前面是列所属的表 FactSales。这称为完全限定的列名称, 因为它包含前面有表名称的列名称。在同一个表中引用的列不要求表名包含在公式中。这可能会使更长的公式引用更多列, 并且更易于阅读。但是, 最好始终在度量值公式中包含表名称, 即使在同一个表中也是如此。
注意:如果表名包含空格、保留关键字或不允许使用的字符,则必须将表名放在单引号中。如果名称包含 ANSI 字母数字字符范围之外的任何字符,还必须将表名称用引号引起来,而不管您的区域设置是否支持该字符集。
您的公式务必具有正确的语法。在大多数情况下,如果语法不正确,就会返回错误。在其他情况下,语法可能正确,但返回的值可能不是您所期望的。
函数
函数是通过使用采用特定顺序或结构的特定值(称为参数)来执行计算的预定义公式。参数可以是其他函数、另一个公式、列引用、数字、文本、逻辑值(例如 TRUE 或 FALSE)或常量。
DAX 包括以下函数“类别”:日期和时间、信息、逻辑、数学、统计、文本以及时间智能函数。如果您熟悉 Excel 公式中的函数,则会发现 DAX 中的许多函数很相似;但 DAX 公式在以下方面很独特:
DAX 函数始终引用完整的列或表。如果您想要仅使用表或列中的特定值,则可以向公式中添加筛选器。
如果需要逐行自定义计算,DAX 可提供让您使用当前行值或相关值作为一种参数来执行计算(因上下文而异)的函数。
DAX 包含的许多函数都将返回表,而不是返回值。表不会显示,而是用于向其他函数提供输入。例如,您可以检索一个表,然后对该表中的非重复值进行计数,或者计算多个已筛选表或列的动态总和。
DAX 包含多种“时间智能”函数。利用这些函数,您可以定义或选择日期范围,并基于它们执行动态计算。例如,您可以比较并行时段内的总和。
上下文
上下文是要了解的最重要的 DAX 概念之一。DAX 中有两种类型的上下文:“行上下文”和“筛选上下文”。
行上下文
行上下文最容易被视作当前行。比如上面写的计算列的公式 =[SalesAmount] - [TotalCost] 针对表中的每一行计算 Margin 列中的一个值。每行的值可通过同一行的其他两列 [SalesAmount] 和 [TotalCost] 中的值进行计算得出。DAX 可以计算 Margin 列中每行的值,因为它具有上下文:对于每一行,它将采用 [TotalCost] 列中的值,并从 [SalesAmount] 列的值中减去前面的值。
行上下文不仅仅应用于计算列。当公式中的函数应用筛选器以标识表中的单个行时, 也会应用行上下文。该函数将对其正在筛选的表的每一行应用自身的行上下文。这种类型的行上下文最常应用于度量值。
筛选上下文
筛选上下文理解起来比行上下文要更难一些。您可以非常轻松地将筛选上下文视为:在确定结果或值的计算中应用的一个或多个筛选器。
筛选上下文不能替代行上下文;而是在应用行上下文之外应用。例如,要进一步缩小计算中要包含的值的范围,您可以应用一个筛选上下文,该上下文不仅指定行上下文,也指定该行上下文中的一个特定值(筛选器)。
可以在矩阵表中轻松地查看筛选上下文。例如,当您将 TotalCost 添加到“值”区域,然后将 Year 和 Region 添加到行或列时,您就定义了一个筛选上下文,此上下文将基于给定的年份和区域选择数据子集。
可以通过在矩阵表中添加列和行标签以及切片器来轻松地应用筛选器上下文, 因此也可以在 DAX 公式中应用筛选上下文, 方法是使用 "全部"、"相关"、"筛选"、"计算" 和 "关系" 等函数定义筛选器。其他度量值和列。例如, 让我们在名为 StoreSales 的度量值中查看以下公式:
很明显,此公式比您前面看到的一些其他公式更复杂。但是,为了更好地理解此公式,我们可以将其分解,这与对待其他公式的方式很相似。
此公式包括以下语法元素:
A: 度量值名称 StoreSales, 后跟冒号:。
B: 等号运算符 (=) 指示公式的开头。
C:CALCULATE 函数在由指定筛选器修改的上下文中计算表达式(作为参数)。
D: 括号 () 括起一个或多个参数。
E: 与表达式位于同一表中的度量值 [销售额]。"销售额" 度量值的公式为: = SUM (FactSales [SalesAmount])。
F: 逗号 (,) 分隔每个筛选器。
G: 引用列和特定值 DimChannel[ChannelName] =”Store”,作为一个筛选器。
此公式将确保仅为 DimChannel [ChannelName] 列中具有值 "存储" 的行 (作为筛选器) 计算销售度量值 (作为筛选器定义的)。
正如您所想像的,可以在公式中定义筛选上下文意味着巨大且强大的功能。能够仅引用相关表中的特定值只是这样的示例之一。如果您未能立即完全了解上下文,请不要担心。当您创建自己的公式时,您将更好地了解上下文以及它在 DAX 中如此重要的原因。
摘自Power BI官方文档,通过上面的这些解释,应该能对DAX有个基本的了解,当一段简单的代码就能动态实现你所需要的结果,你才能真正认识到它的强大,这需要继续学习以及多动手实践。
PowerBI星球