从数据到信息
从信息到洞察

理解 IN 和 CONTAINSROW

当需要根据多个条件判断表中是否存在符合要求的记录时,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" }
与=运算符不同,IN 运算符CONTAINSROW 函数执行严格相等的比较(==)。例如,空白值不能匹配 0

使用动态查找表

查找表可以是一个动态的表表达式,如下面的例子所示,它返回除了所选颜色以外的所有其他颜色的销售额:

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 中应用表构造器作为筛选器参数,不会执行任何筛选。

10
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
3 评论数
7 被回复的评论
4 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
成员
139****3194

高老师
CONTAINSROW ( { “Red”, “Blue”, “Yellow” }, Product[Color] ),这里的Product[Color] )相当于隐藏all吗

成员
bbzhdlp

高老师,这段DAX函数是调Last Year参数的数据,但是,不知道为啥调不出来数据。

234.png
成员
fjlaile

请问,为何我的in 一直提示语法不正确,而CONTAINSROW 却是查无此函数。in 的报错如图(我在excelhome的提问),求大神解答。

企业微信截图_15863963988073.png
DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数