从数据到信息
从信息到洞察

SELECTEDVALUE

SELECTEDVALUE

SELECTEDVALUE ( <ColumnName>, [<AlternateResult>] )

当指定列中只有一个值时返回该值,否则返回替代结果,省略则返回空值。

SELECTEDVALUE 与 IF+HASONEVALUE 等价,而且公式更简洁。

SELECTEDVALUE ( Table[column] )
SELECTEDVALUE ( Table[column], "default value" )
SELECTEDVALUE ( Table[column], 0 )

------- 等价于 ---------

IF ( HASONEVALUE ( Table[column] ), VALUES ( Table[column] ) )
IF ( HASONEVALUE ( Table[column] ), VALUES ( Table[column] ), "default value" )
IF ( HASONEVALUE ( Table[column] ), VALUES ( Table[column] ), 0 )

当需要获取上下文中的单个值时,推荐使用 SELECTEDVALUE,在多值的时候,函数可以返回空白或设定的默认值来容错。

总结

  • SELECTEDVALUE 和 VALUES 函数获取当前筛选上下文,而不是行上下文;
  • 当具有行上下文时,第一参数引用列即可(如果在列位于关系的一端,可以使用 RELATED);
  • 如果引用的列在筛选上下文中返回空行,则 SELECTEDVALUE 返回第二个参数-不要假设仅当选择了两个或更多值时才返回第二参数;
  • 如果你的 DAX 版本没有 SELECTEDVALUE,可以使用 HASONEVALUE/VALUES 代替 SELECTEDVALUE

用法示例

从同一张表中获取列值

比如从产品表中获取产品等级(Product Class)展示在下面的表格中

Product Class := SELECTEDVALUE ( 'Product'[Class] )

这种写法有一个问题,没有销售额的产品也会返回对应的等级,如果要避免这种情况,可以加一个条件判断。

Product Class v1 := 
IF (
    NOT ISBLANK ( [Sales Amount] ), 
    SELECTEDVALUE ( 'Product'[Class] )
)
 
Product Class v2 := 
IF (
    NOT ISEMPTY ( Sales ), 
    SELECTEDVALUE ( 'Product'[Class] )
)

新的写法不会显示销售额为空的记录

从维表中获取指定列的值

当需要从关系的多端出发获取关系一端的值时,如果存在行上下文,比如计算列,可以直接使用 RELATED,无论是否存在中间表,RELATED 将穿过这些关系获取指定的列值;如果是度量值环境,你需要修改筛选上下文在关系中传递的方向。以产品、产品子类别和产品类别三张表的关系为例,如果你想在矩阵或数据透视表中获得当前产品的类别,可以使用以下代码:

Product Category := 
CALCULATE (
    SELECTEDVALUE ( 'Product Category'[Category] ), 
    CROSSFILTER (
        'Product'[ProductSubcategoryKey], 
        'Product Subcategory'[ProductSubcategoryKey], 
        Both
    ),
    CROSSFILTER (
        'Product Subcategory'[ProductCategoryKey], 
        'Product Category'[ProductCategoryKey], 
        Both
    )
)

使用扩展表,还有一种简单的写法

Product Category exp.table := 
CALCULATE (
    SELECTEDVALUE ( 'Product Category'[Category] ), 
    'Product'
)

在扩展表一文中你会了解到,复杂的数据模型中,依赖扩展表很可能会带来意料之外的副作用,因此建议首选 CROSSFILTER 解决方案。

两种写法结果相同

在计算中引用数值列

SELECTEDVALUE 简化了在计算中使用数字列(物理列)作为参数时的语法。例如,下面的度量值用销售额除以所选产品的单价,以计算销售数量。如果选择了多个产品,SELECTEDVALUE 将返回空白,Calc Quantity 也将是空值。

Calc Quantity := 
DIVIDE (
    [Sales Amount], 
    SELECTEDVALUE ( 'Product'[Unit Price] )
)

Audio 行自动返回空

从参数表返回所选参数

简化 IF + HASONEVALUE 的写法

Sales by Scale := 
DIVIDE (
    [Sales Amount],
    SELECTEDVALUE ( 'Scale'[Scale], 1 )
)

---------- 简化下面公式 ----------

Sales by Scale := 
DIVIDE (
    [Sales Amount],
    IF ( HASONEVALUE ( Scale[Scale] ), VALUES ( Scale[Scale] ), 1 )
)

当用户不小心选择多个参数的时候,公式将使用 1 作为分母,如果你想在发生这种情况的时候弹出人性化的提示,可以使用 ERROR 函数

Sales by Scale Checked := 
DIVIDE (
    [Sales Amount],
    SELECTEDVALUE ( 'Scale'[Scale], ERROR ( "Single selection required" ) )
)

 

说点什么

avatar
1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
  订阅本文评论  
提醒