10.6 SELECTEDVALUE


## SELECTEDVALUE SELECTEDVALUE ( , [] )当指定列中只有一个值时返回该值,否则返回替代结果,省略则返回空值。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)展示在下面的表格中10.6 SELECTEDVALUE - 图1Product Class :=SELECTEDVALUE(‘Product’[Class])这种写法有一个问题,没有销售额的产品也会返回对应的等级,如果要避免这种情况,可以加一个条件判断。Product Class v1 :=IF(NOTISBLANK([Sales Amount]),SELECTEDVALUE(‘Product’[Class]))Product Class v2 :=IF(NOTISEMPTY(Sales),SELECTEDVALUE(‘Product’[Class]))10.6 SELECTEDVALUE - 图2新的写法不会显示销售额为空的记录### 从维表中获取指定列的值 当需要从关系的多端出发获取关系一端的值时,如果存在行上下文,比如计算列,可以直接使用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解决方案。10.6 SELECTEDVALUE - 图3两种写法结果相同### 在计算中引用数值列 SELECTEDVALUE简化了在计算中使用数字列(物理列)作为参数时的语法。例如,下面的度量值用销售额除以所选产品的单价,以计算销售数量。如果选择了多个产品,SELECTEDVALUE将返回空白,Calc Quantity也将是空值。Calc Quantity :=DIVIDE([Sales Amount],SELECTEDVALUE(‘Product’[Unit Price]))10.6 SELECTEDVALUE - 图4Audio行自动返回空### 从参数表返回所选参数 简化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))10.6 SELECTEDVALUE - 图5当用户不小心选择多个参数的时候,公式将使用1作为分母,如果你想在发生这种情况的时候弹出人性化的提示,可以使用ERROR函数Sales by Scale Checked :=DIVIDE([Sales Amount],SELECTEDVALUE(‘Scale’[Scale],ERROR(“Single selection required”)))