第3章 使用基本表函数
3.1 表函数简介
3.2 EVALUATE语法简介
3.3 理解FILTER
3.4 ALL和ALLEXCEPT
3.5 了解VALUES,DISTINCT和空行
3.6 将表用作标量值
3.7 ALLSELECTED介绍
在本章中,您将学习DAX中可用的基本表函数。表函数是常规的DAX函数,表函数返回表而不是返回单个值。在编写DAX查询和许多需要对表进行迭代的高级计算时,表函数很有用。本章包含此类计算的几个示例。
本章的目的是介绍表函数的概念,而不是提供DAX中所有表函数的详细说明。第12章“使用表”和第13章“编写查询”中包含大量表函数。这里我们解释DAX中最常见和最重要的表函数,以及如何在常见情况下包括在DAX标量表达式中使用表函数。
表函数简介
到现在为止,您已经看到DAX表达式通常返回单个值,例如字符串或数字。结果为单个值的表达式称为标量表达式。定义度量值或计算列时,请始终编写标量表达式,如下所示:
= 4 + 3
= "DAX is a beautiful language"
= SUM ( Sales[Quantity] )
实际上,度量值的主要目标是产生在报表、数据透视表或图表中呈现的结果。归根结底,所有这些报告的来源都是一个数字,换句话说,就是一个标量表达式。不过,在标量值计算的过程中,您可能会使用表。例如,以下的简单迭代中将一张表用于计算销售额:
Sales Amount := SUMX ( Sales, Sales[Quantity] * Sales[Net Price] )
在以上示例中,SUMX遍历Sales表。因此,尽管完整计算的结果是标量值,但是在计算过程中,该公式会扫描Sales表。像下面的代码一样,相同的代码可以迭代表函数的结果。此代码仅计算数量大于一的行的销售额:
Sales Amount Multiple Items :=
SUMX (
FILTER (
Sales,
Sales[Quantity] > 1
),
Sales[Quantity] * Sales[Net Price]
)
在此示例中,我们使用FILTER函数代替对Sales的引用。直观上,FILTER是一种根据条件筛选表内容的函数。稍后我们将详细描述FILTER。现在,请务必注意,只要是在引用表的地方,就可以用表函数来替代表。
在前面的代码中,您看到了一个用于求和汇总的筛选函数。这不是最佳实践。在下一章中,将学习如何使用CALCULATE来实现更灵活和有效的筛选。本章中示例的目的不是提供DAX度量值的最佳实例,而是说明表函数如何使用简单的表达式工作。稍后,我们将在更复杂的场景中应用这些概念。
此外,在第2章“ DAX简介”中,您了解了可以将变量定义为DAX表达式的一部分,在那里,我们使用变量来存储标量值。但是,变量也可以存储表。例如,可以通过使用变量以以下方式编写先前的代码:
Sales Amount Multiple Items :=
VAR
MultipleItemSales = FILTER ( Sales, Sales[Quantity] > 1 )
RETURN
SUMX (
MultipleItemSales,
Sales[Quantity] * Sales[Unit Price]
)
MultipleItemSales是一个存储整个表的变量,因为其表达式是表函数。我们强烈建议尽可能使用变量,这样代码更易于阅读。简单地为表达式指定个名称,您已经在很好地编写代码了。
在计算列中或在迭代中,还可以使用RELATEDTABLE函数检索相关表的所有行。例如,Product表中的以下计算列用于计算相应产品的销售额:
'Product'[Product Sales Amount] =
SUMX (
RELATEDTABLE ( Sales ),
Sales[Quantity] * Sales[Unit Price]
)
表函数也可以嵌套。例如,以下Product表中计算列计算销售数量大于一的产品销售额:
'Product'[Product Sales Amount Multiple Items] =
SUMX (
FILTER (
RELATEDTABLE ( Sales ),
Sales[Quantity] > 1
),
Sales[Quantity] * Sales[Unit Price]
)
在示例代码中,相关表嵌套在筛选中。通常,当存在嵌套调用时,DAX首先评估最内层函数,然后评估其他函数直至最外层函数。
如您将在后面看到的,嵌套调用的执行顺序可能会引起混乱,因为CALCULATE和CALCULATETABLE的评估顺序与FILTER不同。下一节,您将学习FILTER的行为。在第5章“了解CALCULATE和CALCULATETABLE”中可找到CALCULATE和CALCULATETABLE的描述。
通常,我们不能将表函数的结果用作度量值或计算列的值。度量值和计算列均要求表达式为标量值。相反,我们可以将表表达式的结果分配给计算表。计算表是一种表,其值由DAX表达式确定,而不是从数据源加载。
例如,我们可以使用如下表表达式创建一个包含所有单价大于3,000的产品的计算表:
ExpensiveProducts =
FILTER (
'Product',
'Product'[Unit Price] > 3000
)
计算表在Power BI和Analysis Services中可用,但在Power Pivot for Excel中不可用(截至2019年)。使用表函数的次数越多,在度量值中使用计算表和/或复杂的表表达式来创建更复杂的数据模型就越多。
网友评论