PowerBI之DAX神功:答网友问02.if函数如何用到度量值中
网友提问:IF函数只能用在新建列中吗?如何将它使用在度量值中呢?

其实,不只是IF函数,switch函数也是同理。
例如我们有一张表,表的名字:Sheet1
需求:新增一列,商品是switch显示已买,商品是PS5显示准备买

新建列 = if('Sheet1'[商品]="PS5","准备买","已买")

如果直接将公式 if('Sheet1'[商品]="PS5","准备买","已买") 写成度量值,100%是错的,因为度量值只能将行上下文转换成筛选上下文,但是它不能创建行上下文。

如果是多个数值列的计算,我们可以通过《DAX神功》第1卷12回学习的知识,通过多个列度量值的计算完成,例如下表名字是Sheet2

我们需要A列-B列写成新建列:
新建列='Sheet2'[A]-'Sheet2'[B]
我们需要写成度量值:相当于两个度量值在计算,度量值是筛选上下文,这是筛选上下文内部的计算
度量值=sum('Sheet2'[A])-sum('Sheet2'[B])
也可以写成:使用sumx生成行上下文,放到度量值里,因为度量值天生具有筛选功能,同时度量值将行上下文转化成了筛选上下文件
度量值=sumx('Sheet2','Sheet2'[A]-'Sheet2'[B])
但是如果您写成下面的公式就错了,因为两个列相减是生成行上下文,度量值不能生成行上下文,只能转换行上下文
度量值='Sheet2'[A]-'Sheet2'[B]

现在回归我们这个案例,表名为:Sheet1

我们需要将下面的新建列写成度量值:
新建列 = if('Sheet1'[商品]="PS5","准备买","已买")
现在的情况不一样,它不是数值,是文本类型。
我们回忆一下《DAX神功》第1卷第5回,我们学习的聚合函数与迭代函数

现在我们发现一个问题,聚合函数除了计数以外,只有max和min支持文本。MaxX和MinX与max和min聚合规则是一样的,只是迭代函数运行方式不同,迭代函数是逐行扫描
所以我们可以将度量值写成:
度量值 = MINX('Sheet1',if('Sheet1'[商品]="PS5","准备买","已买"))
或
度量值 = MAXX('Sheet1',if('Sheet1'[商品]="PS5","准备买","已买"))
将度量值放到矩阵或表中:
如果想让总计为空:IF+HASONEVALUE 具体方法详见《DAX神功》第1卷第10回
