表 DAX 表达式

已完成

在 Power BI 中的大多数情况下,你都是通过将数据从外部数据源导入模型来创建表。 而借助表函数,可基于已加载到模型中的数据来添加新表。

概述

表函数使 Power BI 用户可以创建中间表,该表可在数据模型中查看,并可在其他 DAX 表达式中使用。 表函数是可以使用的临时表,但它们不可见,因为它们不会输出。

FILTER、VALUES 和 ALL 是通常在 DAX 度量值中使用的一些常见中间表。

应用 FILTER 函数

FILTER 函数可为特定表设置筛选器,然后在计算中使用表的压缩版本。 换句话说,它会返回表示另一个表或表达式的子集的表。

例如,假设你具有以下数据表:

会在 FILTER 函数示例中引用的数据表。

在前面的表中,你具有一些突出显示 Seattle 销售额的行。 2018 年 Seattle 的总销售额为 30.13 (20.46 + 9.67)。 若要使用 FILTER 函数获得此结果:

2018 Sales = SUMX(
  FILTER(
    Sales,
    YEAR( Sales[SalesDate] ) = 2018
  ),
  [Price]*[Quantity]
)

提示

与 TABLEAU 的关联:若要在 Tableau 中创建相同计算,请使用 IF/THEN 语法:2018 Sales = IF YEAR([SalesDate]) = 2018 THEN SUM([Price]*[Quantity]) END

在前面的代码片段中,先检索了筛选器上下文的数据,即 Sales 事实数据表:

Sales 事实数据表的数据预览。

接下来,将销售额数据筛选为仅包含 2018 年销售额。

突出显示 2018 年销售额的 Sales 事实数据表的数据预览。

最后计算了表达式,但只计算了临时表中的记录。

筛选为显示 2018 年销售额的 Sales 事实数据表的数据预览。

应用 VALUES 函数

VALUES 返回包含指定表或列中非重复值的单列表;会删除重复值,仅返回唯一值。

例如,你刚刚接到一个任务,需要显示运动队中哪个球员有最后一笔需要支付的未付罚款余额。

下面是会使用的数据表(名为 Team Fine Details):

会在 VALUES 函数示例中引用的数据表。

需要执行的操作是测试是否只有一个球员要付清罚款。 如果是,则显示其姓名。 否则显示消息“more than one player”。

可以使用 VALUES 函数实现此目的:

LastPlayer = IF(
  COUNTROWS( VALUES( 'Team Fine Details'[SportsTeam] ) ) = 1,
  VALUES( 'Team Fine Details'[PlayerName] ),
  "More than one player"
)

提示

与 TABLEAU 的关联:这演示了如何在 Tableau 中进行相同的计算:LastPlayer = IF COUNTD([SportsTeam]) = 1 THEN [PlayerName] ELSE "More than one player" END

此度量值会类似于以下报表/可视化效果:

包含 LastPlayer 计算的示例报表。

应用 ALL 函数

ALL 函数会告知 Power BI 查看特定表,从采用其中的所有值(不筛选该表),并在表达式中使用值的子集。

ALL 函数的一个常见用途是了解聚合度量值总计的百分比。

例如,请考虑运动队罚款金额方案。 你的老板对你在前面任务中的调查结果十分满意,但是想知道哪个运动队的未付罚款百分比最高。

包含 LastPlayer 计算的最新报表。

第一步是为未付罚款总计创建度量值:

TotalAllFineAmount = CALCULATE( [TotalFineAmount], ALL( 'Team Fine Details'[SportsTeam] ) )

提示

与 TABLEAU 的关联:这演示了如何使用 FIXED LOD 表达式在 Tableau 中进行相同的计算。 在表级别聚合总计 TotalFineAmount:TotalAllFineAmount = { FIXED : SUM([TotalFineAmount]) }

第二步和最后一步是使用 DIVIDE 函数创建总计度量值的百分比:

FineAmountPercentOfTotal = DIVIDE( [TotalFineAmount], [TotalAllFineAmount] )

提示

与 TABLEAU 的关联:这演示了如何在 Tableau 中进行相同的计算:FineAmountPercentOfTotal = SUM([TotalFineAmount]) / SUM([TotalAllFineAmount])