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