COUNTAX和COUNTX(DAX)中的“表达式”是什么?

5
COUNTAX(DAX)和COUNTX(DAX)的文档表明,第二个参数是一个表达式,该表达式对每一行进行评估。
参见:https://learn.microsoft.com/en-us/dax/countax-function-dax 这正是我所需要的,但我无法确定“表达式”应该是什么样子的。
微软文档中给出的示例如下:
=COUNTAX(FILTER('Reseller',[Status]="Active"),[Phone])

但是第二个参数 ([Phone]) 看起来并不像一个表达式。在我的理解中,表达式应该是类似于 "value > 3 AND value <= 10" 这样的东西。
在这里可以使用什么样的表达式?
3个回答

2
在这个例子中,[Phone] 是为结果表的每一行评估的表达式。需要澄清的是,由于COUNTAXCOUNTX返回非空行的计数,因此[Phone]列中非空值的计数是计算出的表达式。在应用FILTER函数到表之后,该表达式在此上下文中等同于COUNT([Phone])。使用Dax Studio中的Server Timings特性,可以查看传递给存储引擎的文本表示。在COUNTX的情况下,您将看到一个带有WHERE子句中的IS NOT NULL的查询,该子句用于表示作为表达式使用的列,例如在这种情况下,它是[Phone],选择了COUNT函数,因为具有空白[Phone]的任何行已经被过滤掉了。
下面的语句是来自DAX Studio中Server Timings功能的示例查询,使用了您问题中的示例度量。如您所见,在WHERE子句中有两个过滤器。第一个是对Status列的过滤器,仅返回处于活动状态的行。第二个是排除Phone列中的null值。这样就留下了COUNT聚合函数来计算具有活动StatusPhone列中非空值的所有行的计数,这相当于使用Status进行计数的Phone列。此处的查询仅是发送到存储引擎的请求的文本表示,因此显示的语法不会是实际的SQL,但它将更好地让您了解DAX是如何被处理的。
SET DC_KIND="AUTO";
SELECT
COUNT (  )
FROM 'Reseller'
WHERE
    'Reseller'[Status] = 'Active' AND
    'Reseller'[Phone] IS NOT NULL;

'Estimated size ( volume, marshalling bytes ) : 224012, 1392082'

0

感谢 @userfl89 的启发性和分析性解释。 我现在明白了 <expression> 实际上是一个 WHERE 子句。现在我开始理解为什么 Microsoft 选择在这里使用单词“表达式”。 不过,所有这一切仍然充满了矛盾。

Count 的语法是 COUNT(<column>)

然后,在 COUNT([Phone]) 中的 [Phone] 是类型为 <column> 的内容。我猜这也只是对存储引擎的 WHERE 子句? 与 COUNTAX(FILTER('Reseller',[Status]="Active"),[Phone]) 相比,其中 [Phone] 的类型是 <expression>

COUNTAX 中真正的逻辑实际上是 FILTER 函数。 <expression> 总是一个 WHERE 子句,但选择非空值。好吧,它是一个“表达式”,但它总是相同的。是吗?

我不得不得出这样的结论:微软在语法描述中的类型系统有些混乱,这使得我(作为PowerBI的初学者)很难根据他们的文档制作自己的DAX查询。 或者他们应该提供更好的示例来弥补令人困惑的语法描述。

1
我更新了我的答案,并提供了一个度量如何处理的示例。希望这有助于澄清事情。 - userfl89
你的例子解释了很多问题,我会尝试更轻松地阅读微软的语法。同时,感谢你指出 DAX Studio 的存在。 - mgpmul
没问题。如果我的回答涵盖了你所问的内容,请随意将其标记为已接受。没有义务这样做,只是让未来查看帖子的人更容易理解。如果你仍在处理这个问题,并想保持现状,那也可以。 - userfl89

0
通常在DAX中,“表达式”一词表示列或公式,因此您可以在countax/countx或任何其他针对每行进行评估的函数中使用列或公式(通常以x结尾的函数:D)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接