本节你会了解 DAX 中标量函数和表函数的区别。表函数是 DAX 内部计算的核心,在编写 DAX 查询而不是度量值或计算列时,表函数非常有用
本文将介绍表函数在 DAX 中的作用, 以及如何在基础场景中使用它们。
表函数介绍
DAX 是一种函数式语言,表达式在计值后得到结果。到目前为止,你已经知晓 DAX 表达式通常返回单个值,例如字符串或数字。我们称这些表达式为标量表达式。当定义度量值或计算列时,我们使用的都是标量表达式,如下面的示例所示:
= 4 + 3 = "DAX is a beautiful language" = SUM ( Sales[Quantity] )
但是, 你还可以编写生成表的 DAX 表达式作为结果。我们不能直接将生成表的函数表达式分配给度量值或计算列, 但这不妨碍表函数成为 DAX 的重要组成部分。例如, 有些 DAX 函数允许将返回表的表达式作为其参数,编写 DAX 查询的时候也需要用到这种表表达式。
返回表的表达式的最简单的例子是在 DAX 表达式中引用表名,下面这个表达式返回销售表的全部内容(所有列和所有行):
= Sales
度量值只能返回单个值
如果你尝试将返回表的表达式分配给度量值或计算列, 会出现错误:
该表达式引用多列,多列不能转换为标量值
因为度量值只能返回单个值(标量)。你需要进一步操作表表达式以获得一个标量值,使用接受表表达式作为参数的聚合函数可以完成这个任务。例如, 使用 COUNTROWS 函数计算表包含的行数:
= COUNTROWS ( Sales )
COUNTROWS 的用法
COUNTROWS ( <table> )
COUNTROWS 使用接受表表达式作为参数的 DAX 函数,你可以在参数中直接引用表名,或者引用返回表的函数。
我们根据 DAX 函数的返回类型对其进行分类。我们称返回标量值的函数为“标量函数”,返回表的为“表函数”。例如,COUNTROWS 是一个标量函数,因为它返回一个数值,并接受一个表作为参数。
表函数通常对一个表进行操作,更改原始表的行和/或列。例如,可以使用以下表达式计算单价大于 100 的销售表的行数:
= COUNTROWS ( FILTER ( Sales, Sales[Unit Price] > 100 ) )
FILTER 返回一个表,其中只包含单价大于 100 的行。
通常,我们在代码中使用返回表的表达式来迭代表格的行,并聚合一些值,以返回一个标量值作为结果。表表达式不能直接分配给度量值或计算列,但是,你可以在 Power BI Desktop 中通过新建表来使用表表达式,或在 DAX 查询中使用表表达式,以物化(materializing)表表达式的内容。
例如, 你可以通过执行下面的表达式来获取单位价格大于 100 的所有销售记录组成的表, 结果如图所示。
= FILTER ( Sales, Sales[Unit Price] > 100 )
DAX 也提供了 EVALUATE 语句,你可以用它来计算返回表的表达式:
EVALUATE FILTER ( Sales, Sales[Unit Price] > 100 )
你可以在任何客户端工具中执行 DAX 查询(Microsoft Excel、Power BI Desktop、DAX Studio、SQL Server Management Studio、Reporting Services 等)。在下一篇文章中,你将看到对 EVALUATE 语法更详细的解释。
说点什么