第3章 使用基本表函数
将表用作标量值
尽管VALUES是表函数,但由于DAX的特殊功能,我们经常使用它来计算标量值:具有单行和单列的表可以当作标量值使用。想象一下,我们产生了如图3-13所示的报告,报告了按类别和子类别划分的品牌数量。
可能还需要在个数旁边查看品牌名称。一种可能的解决方案是使用VALUES检索不同的品牌,不是进行计数,而是返回它们的品牌名。只有在品牌只有一个值的特殊情况下,才有可能这样做。实际上,在这种情况下,可以返回VALUES的结果,而DAX会自动将其转换为标量值。为了确保只有一个品牌,需要使用IF语句保护代码:
Brand Name :=
IF (
COUNTROWS ( VALUES ( Product[Brand] ) ) = 1,
VALUES ( Product[Brand] )
)
结果在图3-14中可见。当“品牌名称”列为空时,表示存在两个或更多不同的品牌。
Brand Name 度量值使用 COUNTROWS 来检查 Products 表的 Color 列是否仅选择了一个值。因为此模式在DAX代码中经常使用,所以有一个更简单的函数可以检查列是否只有一个可见值:HASONEVALUE。以下是基于 HASONEVALUE 的Brand Name 度量值的更好实现:
Brand Name :=
IF (
HASONEVALUE ( 'Product'[Brand] ),
VALUES ( 'Product'[Brand] )
)
此外,为使开发人员的更轻松,DAX还提供了一种功能,该功能可自动检查列是否包含单个值,如果包含,则将其作为标量返回。如果有多个值,则还可以定义要返回的默认值。该函数为SELECTEDVALUE。先前的度量也可以定义为
Brand Name := SELECTEDVALUE ( 'Product'[Brand] )
通过包含第二个可选参数,可以提供一条消息,指出结果包含多个结果:
Brand Name := SELECTEDVALUE ( 'Product'[Brand], "Multiple brands" )
最新度量值的结果在图3-15中可见。
如果不是要列出 “Multiple brands”这样的信息,而是要列出所有品牌怎么办?在这种情况下,一种选择是迭代Product [Brand]的VALUES并使用CONCATENATEX函数,即使存在多个值,该函数也会产生良好的结果:
[Brand Name] :=
CONCATENATEX (
VALUES ( 'Product'[Brand] ),
'Product'[Brand],
", "
)
现在,结果包含用逗号分隔的不同品牌,而不是笼统的消息,如图3-16所示。
。