当需要根据多个条件判断表中是否存在符合要求的记录时,IN 的写法更为简洁。例如:
FILTER ( ALL ( DimProduct[Color] ), DimProduct[Color] = "Red" || DimProduct[Color] = "Yellow" || DimProduct[Color] = "Blue" ) ------------- 等价于 ---------------- FILTER(ALL(DimProduct[Color]), [Color] IN { "Red", "Yellow", "Blue" })
在数据类型和运算符一文中,我们介绍过 IN,它等价于 CONTAINSROW 函数
支持环境
- Power BI Desktop:从 2016 年 11 月之后的版本
- Excel:Excel 2016 Verson 1701 及之后的版本
- SQL Server 分析服务:SQL Server 2016 之后的版本
CONTAINSROW
CONTAINSROW ( <Table>, <Value>, [ <Value>, [ … ] ] )
如果表中存在或包含一行使得所有列都具有指定的值,则返回 TRUE,否则返回 FALSE。除语法外,IN 运算符和 CONTAINSROW 函数在功能上是等价的。
参数 | 属性 | 描述 |
---|---|---|
Table | 需要进行查找的表 | |
Value | 可重复 | 在对应的列进行查找的标量表达式 |
以下写法判断产品表颜色列是否存在颜色为红色、蓝色或黄色的行,两种写法等价:
CONTAINSROW ( { "Red", "Blue", "Yellow" }, Product[Color] ) Product[Color] IN { "Red", "Blue", "Yellow" }
使用动态查找表
查找表可以是一个动态的表表达式,如下面的例子所示,它返回除了所选颜色以外的所有其他颜色的销售额:
Other Colors := CALCULATE ( [Sales Amount], Products[Color] IN EXCEPT ( ALL ( Products[Color] ), VALUES ( Products[Color] ) ) )
Other Colors 2 := CALCULATE ( [Sales Amount], EXCEPT ( ALL ( Products[Color] ), VALUES ( Products[Color] ) ) )
请注意,上面的语法只是应用于 IN 的动态表达式的一个演示。实际应用中,这个需求可以直接使用 EXCEPT 来获得精确的结果。
否定判断
DAX 不支持 NOT IN 运算符,要执行 IN 的否定运算,你需要将 NOT 放在整个表达式前面:
NOT [Color] IN { "Red", "Yellow", "Blue" }
多列匹配
( 'Date'[Year], 'Date'[MonthNumber] ) IN { ( 2018, 12 ), ( 2019, 1 ) } CONTAINSROW ( { ( 2018, 12 ), ( 2019, 1 ) }, 'Date'[Year], 'Date'[MonthNumber] )
FILTER ( SUMMARIZE ( DimProduct, [Color], [Size] ), ( [Color], [Size] ) IN { ( "Black", "L" ) } ) FILTER ( SUMMARIZE ( DimProduct, [Color], [Size] ), CONTAINSROW ( { ( "Black", "L" ) }, [Color], [Size] ) )
不具有数据沿袭
在创建内联表的表构造器一节介绍过,表构造器结果是一个匿名表,其中每一列都有一个由使用的行构造函数推断出的数据类型,但是它没有任何与数据库底层列相对应的数据沿袭。因此,如果在 CALCULATE 中应用表构造器作为筛选器参数,不会执行任何筛选。
高老师
CONTAINSROW ( { “Red”, “Blue”, “Yellow” }, Product[Color] ),这里的Product[Color] )相当于隐藏all吗
高老师,这段DAX函数是调Last Year参数的数据,但是,不知道为啥调不出来数据。
请问,为何我的in 一直提示语法不正确,而CONTAINSROW 却是查无此函数。in 的报错如图(我在excelhome的提问),求大神解答。