3.6 将表用作标量值

第3章 使用基本表函数

将表用作标量值

尽管VALUES是表函数,但由于DAX的特殊功能,我们经常使用它来计算标量值:具有单行和单列的表可以当作标量值使用。想象一下,我们产生了如图3-13所示的报告,报告了按类别和子类别划分的品牌数量。

图3-13 报告显示了每个类别和子类别可用的品牌数量

可能还需要在个数旁边查看品牌名称。一种可能的解决方案是使用VALUES检索不同的品牌,不是进行计数,而是返回它们的品牌名。只有在品牌只有一个值的特殊情况下,才有可能这样做。实际上,在这种情况下,可以返回VALUES的结果,而DAX会自动将其转换为标量值。为了确保只有一个品牌,需要使用IF语句保护代码:

 Brand Name :=
IF (
    COUNTROWS ( VALUES ( Product[Brand] ) ) = 1,
    VALUES ( Product[Brand] )
)

结果在图3-14中可见。当“品牌名称”列为空时,表示存在两个或更多不同的品牌。

图3-14 当VALUES返回单行时,我们可以将其用作标量值,就像在Brand Name度量值中一样

Brand Name 度量值使用 COUNTROWS 来检查 Products 表的 Color 列是否仅选择了一个值。因为此模式在DAX代码中经常使用,所以有一个更简单的函数可以检查列是否只有一个可见值:HASONEVALUE。以下是基于 HASONEVALUEBrand 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中可见。

图3-15 如果Brand Name列有多行,则SELECTEDVALUE返回默认值

如果不是要列出 “Multiple brands”这样的信息,而是要列出所有品牌怎么办?在这种情况下,一种选择是迭代Product [Brand]的VALUES并使用CONCATENATEX函数,即使存在多个值,该函数也会产生良好的结果:

[Brand Name] :=
CONCATENATEX (
    VALUES ( 'Product'[Brand] ),
    'Product'[Brand],
    ", "
)

现在,结果包含用逗号分隔的不同品牌,而不是笼统的消息,如图3-16所示。

图3-16 *CONCATENATEX* 用连接表达式从表中构建字符串

你可能感兴趣的:(3.6 将表用作标量值)