第2章 DAX简介
2.1 理解DAX计算
2.2了解计算列和度量值
2.3 变量入门
2.4 表达式中的错误处理
2.5 格式化DAX代码
2.6 聚合函数和迭代函数
2.7 使用常见的DAX函数
格式化DAX代码
在继续解释DAX语言之前,我们要介绍DAX的一个重要方面,即格式化代码。DAX是一种函数语言,这意味着无论它多么复杂,DAX表达式其实都像一个函数调用。代码的复杂性转化为用作最外层函数的参数的表达式的复杂性。
因此,通常会看到超过10行或更多行的表达式,看到20行的DAX表达式也是家常便饭,对此您将不会陌生。但是,随着公式的长度和复杂性的增加,对代码进行格式化以使其易于阅读就显得非常重要。
没有格式化DAX代码的"官方"标准,但是我们认为标准对格式化代码很重要。以下介绍的可能不是完美的标准,您可能会喜欢一些不同的东西,对此没有任何问题:找到最佳标准并使用它。您唯一需要记住的是:格式化代码,永远不要在一行上编写所有内容;否则,您将比预期更早陷入麻烦。
为了理解格式化为何如此重要的原因,来看一个时间智能计算的公式,这个公式有点复杂,但远不是最复杂的公式。如果不以某种方式设置表达式的格式,则它的样子如下:
IF(CALCULATE(NOT ISEMPTY(Balances), ALLEXCEPT
(Balances, BalanceDate)),SUMX (ALL(Balances
[Account]), CALCULATE(SUM
(Balances[Balance]),LASTNONBLANK(DATESBETWEEN(BalanceDate[Date],
BLANK(),MAX(BalanceDate[Date])),CALCULATE(COUNTROWS(Balances))))),BLANK())
现在这个样子,要试图了解该公式计算的内容几乎是不可能的。没有最外层函数的线索,以及DAX如何评估不同的参数,创建完整的执行流程。我们已经看到了太多学生编写出这样的公式,他们有时会寻求我们的帮助,以了解为什么公式返回错误的结果,你猜怎么了?我们要做的第一件事,就是格式化表达式,完成以后我们才开始研究它。同一表达式正确格式化后如下所示:
IF (
CALCULATE (
NOT ISEMPTY ( Balances ),
ALLEXCEPT (
Balances,
BalanceDate
)
),
SUMX (
ALL ( Balances[Account] ),
CALCULATE (
SUM ( Balances[Balance] ),
LASTNONBLANK (
DATESBETWEEN (
BalanceDate[Date],
BLANK (),
MAX ( BalanceDate[Date] )
),
CALCULATE (
COUNTROWS ( Balances )
)
)
)
),
BLANK ()
)
代码是相同的,但是这次更容易看到IF的三个参数。最重要的是,缩进线自然形成了功能块,更容易弄清完整的执行流程。该代码仍然很难阅读,但是现在的问题是DAX本身,而不是格式化做得差。更详细的使用变量的语法可以帮助您阅读代码,即使这样,格式化对于正确理解每个变量的范围也很重要:
IF (
CALCULATE (
NOT ISEMPTY ( Balances ),
ALLEXCEPT (
Balances,
BalanceDate
)
),
SUMX (
ALL ( Balances[Account] ),
VAR PreviousDates =
DATESBETWEEN (
BalanceDate[Date],
BLANK (),
MAX ( BalanceDate[Date] )
)
VAR LastDateWithBalance =
LASTNONBLANK (
PreviousDates,
CALCULATE (
COUNTROWS ( Balances )
)
)
RETURN
CALCULATE (
SUM ( Balances[Balance] ),
LastDateWithBalance
)
),
BLANK ()
)
DAXFormatter.com
我们创建了一个专门用于格式化DAX代码的网站。我们为自己创建此站点是因为格式化代码是一项耗时的操作,我们把时间花在了格式化自己写的每个公式上。当该工具可用时,我们决定将其捐赠给公共领域,以便用户可以格式化自己的DAX代码(顺便说一下,我们已经能够以此来推广我们的格式化规则)。
您可以在以下网站找到:
http://www.daxformatter.com/) [www.daxformatter.com](www.daxformatter.com
用户界面很简单:只需复制DAX代码,单击FORMAT,页面就会刷新,显示格式良好的代码版本,然后可以将其复制并粘贴到原始窗口中。
这是我们用来格式化DAX的一组规则:
- 始终使用空格将函数名称(例如IF,SUMX和CALCULATE)与任何其他术语分开,并始终以大写形式书写。
- 将所有列引用以TableName [ColumnName]的形式编写,表名和方括号之间没有空格。始终包含表名。
- 将所有度量值引用以[MeasureName]的形式编写,没有任何表名。
- 始终在逗号后使用空格,并且切勿在逗号前加空格。
- 如果公式适合一行,请不要应用任何其他规则。
- 如果公式不适合一行,则:
- 将函数名称连同左括号单独放在一行上,
- 将所有参数放在单独的行上,缩进四个空格,除了最后一个参数外,以逗号结尾。
- 将右括号与调用的函数对齐,单独一行。
这些是我们使用的基本规则。有关这些规则的详细列表,请访问:
http://sql.bi/daxrules 。
如果您找到一种最适合您的阅读方式的公式表达方法,请使用它。格式化的目的是使公式更易于阅读,因此请使用最适合您的技术。定义个人格式规则时要记住的最重要一点是,您始终需要能够尽快看到错误。象如前所述的未格式化代码中,如果缺少右括号,是很难发现错误所在的。在格式化的公式中,更容易看到每个右括号如何与调用函数的左括号匹配。
格式化DAX提示:
格式化DAX并非易事,因为通常我们在文本框中使用小字体编写DAX。Power BI,Excel和Visual Studio不同的版本为DAX提供不同的文本编辑器。以下这些提示有助于编写DAX代码。
要增加字体大小,请在按住Ctrl的同时旋转鼠标上的滚轮按钮,以便更轻松地查看代码。
要在公式中添加新行,请按Shift + Enter。
如果您不适合在文本框中进行编辑,请将代码复制到另一个编辑器(如记事本或DAX Studio)中,然后将公式复制并粘贴回文本框中。
当您查看DAX表达式时,乍一看可能很难理解它是计算列还是度量。因此,在我们的书和文章中,每当定义计算列时都使用等号(=),并使用赋值运算符(:=)定义度量值。CalcCol = SUM ( Sales[SalesAmount] ) -- is a calculated column Store[CalcCol] = SUM ( Sales[SalesAmount] ) -- is a calculated column in Store table CalcMsr := SUM ( Sales[SalesAmount] ) -- is a measure
最后,就像我们在每个示例中一样,在代码中使用列和度量值时,我们建议总是将表名放在列之前,永远不要将表名放在度量值之前。
网友评论