加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,提问交流,有问必答。
使用DAX在数据表中新建计算列,经常从另一个表中查找返回符合条件的值,类似于Excel的VLOOKUP,又高于Excel的VLOOKUP。
举例
以销量表和价格表为例,为销量表从价格表中查找返回产品的价格。
基于查找表(价格表)的3种形式,对应有3种方案。
方案1 两表之间存在一对一或多对一关系,用RELATED函数,与Excel的VLOOKUP最相似。
1 方向是多端查找一端
2 支持跨表的关系传递
3 性能优于其他方案
4 非活动的虚线关系不适用
价格表中每个产品只出现一次,每个产品只对应一个价格,存在多对一关系。
价格1 = RELATED('价格表1'[价格])
方案2 两表之间不存在关系,条件判断逻辑使用“等于”,用LOOKUPVALUE函数。
1 返回的值必须唯一,否则返回空或者预设结果(公式的最后一个参数)
2 支持多条件查找
价格表中产品的价格需要靠产品列和年份锁定唯一值。
价格2 = LOOKUPVALUE('价格表2'[价格],'价格表2'[产品],[产品],'价格表2'[年份],YEAR([日期]))
坑点:行数太多会莫名其妙整列返回空值。原因是:在某些情况下(比如数据量大),LOOKUPVALUE会因为CallbackDataID请求存储引擎查询,导致执行慢、低性能、丢数据。此时,请考虑方案3。
方案3 两表之间不存在关系,条件判断允许复杂逻辑,用CALCULATE+VALUES+FILTER,从一个无关系的表中筛选出唯一值。
1 返回的值必须唯一,否则会报错,如果业务本身就是唯一值,应显示报错并去更正数据源
2 如果接受返回任意一个值,可以用MAX或MIN替换VALUES取最大值或最小值
3 如果接受返回平均值,可以用AVERAGE替换VALUES
4 如果表之间有关系,可以使用ALL或REMOVEFILTERS清除关系,再进行筛选取值
价格表中产品出现多次,需要用指定的日期区间锁定唯一值。
价格3 =
CALCULATE(VALUES('价格表3'[价格]),
FILTER('价格表3',
'价格表3'[产品]='销量表'[产品] &&
'价格表3'[价格开始日期]<='销量表'[日期] &&
'价格表3'[价格结束日期]>='销量表'[日期]
)
)