请注意,度量返回标量,而不是表格结果集。所以我在这里从三个方面来回答。第一个是最少的 DAX,并且依赖于客户端报告工具中的过滤。第二个是在内部进行过滤的措施,因此将始终返回大于 1 封电子邮件的用户数。最后一个是DAX查询,相当于SQL查询。
不过,首先,我将在 Power BI 中创建一个快速而肮脏的数据集以供使用:
//Users
let
Source =
#table(
{"User", "Email"},
{{"Bob", "bob1@example.com"},
{"Bob", "bob2@example.com"},
{"Joe", "joe@example.com"},
{"Joe", "joe@example.com"},
{"Jane", "jane@example.com"}})
in
Source
这为我们提供了一个如下所示的表格:
User Email
Bob bob1@example.com
Bob bob2@example.com
Joe joe@example.com
Joe joe@example.com
Jane jane@example.com
所以,对于我们的简单版本:
Distinct Emails = DISTINCTCOUNT ( 'Users'[Email] )
我们可以使用 [DistinctEmails] > 1 上的过滤器构建“用户”[User] 和 [DistinctEmails] 的视觉效果:
因此,现在始终返回具有不同电子邮件计数 > 1 的用户计数的度量。即使在不使用“用户”[用户]字段的视觉效果中,或者在子和总计级别上,这也将起作用。请注意,这是用户数,而不是电子邮件数。
User Count with Multiple Distinct Emails =
COUNTROWS (
FILTER (
VALUES ( 'Users'[User] ),
[Distinct Emails] > 1
)
)
请注意,我们在此度量的定义中使用了我们的 [Distinct Emails]。 FILTER 迭代在 arg1 中传递的表。这是VALUES ( 'Users'[User] ),它返回列中唯一值的 1 列表。对于该表中的每一行,它评估 arg2 中的谓词 [Distinct Emails] > 1。因此,它会删除任何未通过该测试的用户。 FILTER 输出所有通过测试的值的表格。 COUNTROWS ...好吧,它计算行数。问:
这是视觉上的衡量标准。请注意,视觉对象上没有过滤器。
最后是对原始 SQL 的等效查询。
EVALUATE
FILTER (
SUMMARIZECOLUMNS (
'Users'[User],
"Email Count", [Distinct Emails]
),
[Email Count] > 1
)
SUMMARIZECOLUMNS 选择、分组、过滤器和项目。在这里,我们使用它来选择和分组“用户”[用户]。我们正在投影一个新列,别名为“电子邮件计数”,计算结果为 [Distinct Emails](我们在上面定义的度量)。我们将SUMMARIZECOLUMNS 的输出('Users'[User] 和 [Email Count] 的两列表)传递给FILTER,它检查投影列 [Email Count] 的值。
结果集只是 bob。