昨天登录公众号,看到几位朋友的私信,其中一位问了一个PowerBI的问题,已是上周四的了,昨天要发另外一篇,今天就补上,希望不会太迟。

大概问题是,有一列字段,里面很多字符串,需要根据每条字符的最后几个字段进行判断,如果符合要求就进行计数,为了再延展一下,我就模拟了一个列表,如下↓

一共有10行,数据很简单,首先是计算以pro结尾的列数。这里为了方便,就先通过新建列的方式看一下效果。上面这种以pro结尾的,直接使用if判断就行,使用right计算后三位的值是否是pro,DAX和结果如下↓
pro结尾 = IF(RIGHT([title],3)="pro",1,BLANK())

结果和预期一样,只有4列以pro结尾的返回了值。这是单条件判断,根据需求是需要多条件判断,只要满足一个条件就可以返回值,所以这里在加一个如果是plus结尾的,也返回值,思路还是一样的,只是再加一个条件就行了↓
pro/plus结尾 =
IF(
RIGHT([title],3)="pro" || RIGHT([title],4)="PLUS",
1,
BLANK()
)

从结果可以看出,以pro和plus结尾的就返回了值。下面是拓展部分,如果是字段中包含pro字段才返回值。这时候就可以使用CONTAINSSTRING函数,只要包含某个字符就返回指定值,DAX语句如下↓
包含pro =
IF(
CONTAINSSTRING([title],"pro"),
1,
BLANK()
)

可以看到除了结尾是pro的字段,中间包括pro的也返回了值,然后是多条件同理↓
包含pro/plus =
IF(
CONTAINSSTRING([title],"pro")||
CONTAINSSTRING([title],"plus"),
1,
BLANK()
)

也是正确返回了结果。但是倒数第三个写错了,写成了plas,这种也可以通过这个函数,使用*号进行模糊匹配,就能返回值了↓
包含pro/plus模糊 =
IF(
CONTAINSSTRING([title],"p*o")||
CONTAINSSTRING([title],"p*s"),
1,
BLANK()
)

【度量值部分】
上面是通过新建列的方式直观的展示效果,但是大部分情况下实在度量值中使用的。下面就新建几个度量值来实现,第一个是使用right函数来判断最后三个值是否是pro,结果是正确的↓
end_pro =
CALCULATE(
COUNTROWS('data'),
FILTER(
'data',
RIGHT('data'[title],3) = "pro"
)
)
end_pro/plus =
CALCULATE(
COUNTROWS('data'),
FILTER(
'data',
(RIGHT('data'[title],3) = "pro" ||
RIGHT('data'[title],4) = "plus")
)
)

然后是使用CONTAINSSTRING函数来实现,分别是单个条件和两个条件的情况↓
contain_pro =
CALCULATE(
COUNTROWS('data'),
FILTER(
'data',
CONTAINSSTRING('data'[title], "pro")
)
)
contain_pro/plus =
CALCULATE(
COUNTROWS('data'),
FILTER(
'data',
CONTAINSSTRING('data'[title], "pro") ||
CONTAINSSTRING('data'[title], "plus")
)
)

最后是使用模糊匹配的结果↓
contain_pro/plus模糊 =
CALCULATE(
COUNTROWS('data'),
FILTER(
'data',
CONTAINSSTRING('data'[title], "p*o") ||
CONTAINSSTRING('data'[title], "p*s")
)
)

现在应该能够解决相关的问题了,最后解释一下为什么在Excel中有大小写,在PowerBI里面就没有了的问题。其实在PowerQuery里面是严格遵循大小写的,也就是M语言区分大小写,而DAX语言不区分,大概差异如下↓
End