[知识体系] 理解 IN 和 CONTAINSROW

  [复制链接]
查看262672 | 回复186 | 2021-2-21 18:56:24 | 显示全部楼层 |阅读模式
当需要根据多个条件判断表中是否存在符合要求的记录时,IN 的写法更为简洁。例如:
  1. FILTER (
  2.     ALL ( DimProduct[Color] ),
  3.     DimProduct[Color] = "Red"
  4.         || DimProduct[Color] = "Yellow"
  5.         || DimProduct[Color] = "Blue"
  6. )

  7. -------------  等价于 ----------------

  8. 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
  1. CONTAINSROW ( <Table>, <Value>, [ <Value>, [ … ] ] )
复制代码

如果表中存在或包含一行使得所有列都具有指定的值,则返回 TRUE,否则返回 FALSE。除语法外,IN CONTAINSROW 函数在功能上是等价的。

参数属性描述
Table需要进行查找的表
Value可重复在对应的列进行查找的标量表达式


以下写法判断产品表颜色列是否存在颜色为红色、蓝色或黄色的行,两种写法等价:
  1. CONTAINSROW ( { "Red", "Blue", "Yellow" }, Product[Color] )
  2. Product[Color] IN { "Red", "Blue", "Yellow" }
复制代码
与=CONTAINSROW 函数执行严格相等的比较(==)。例如,空白值不能匹配 0
使用动态查找表

查找表可以是一个动态的表表达式,如下面的例子所示,它返回除了所选颜色以外的所有其他颜色的销售额:
  1. Other Colors :=
  2. CALCULATE (
  3.     [Sales Amount],
  4.     Products[Color] IN
  5.         EXCEPT (
  6.             ALL ( Products[Color] ),
  7.             VALUES ( Products[Color] )
  8.         )
  9. )
复制代码
  1. Other Colors 2 :=
  2. CALCULATE (
  3.     [Sales Amount],
  4.     EXCEPT (
  5.         ALL ( Products[Color] ),
  6.         VALUES ( Products[Color] )
  7.     )
  8. )
复制代码

请注意,上面的语法只是应用于 IN 的动态表达式的一个演示。实际应用中,这个需求可以直接使用 EXCEPT 来获得精确的结果。

否定判断

DAX 不支持 NOT IN 运算符,要执行 IN 的否定运算,你需要将 NOT 放在整个表达式前面:
  1. NOT [Color] IN { "Red", "Yellow", "Blue" }
复制代码
多列匹配
  1. ( 'Date'[Year], 'Date'[MonthNumber] ) IN { ( 2018, 12 ), ( 2019, 1 ) }
  2. CONTAINSROW ( { ( 2018, 12 ), ( 2019, 1 ) }, 'Date'[Year], 'Date'[MonthNumber] )
复制代码
  1. FILTER (
  2.     SUMMARIZE ( DimProduct, [Color], [Size] ),
  3.     ( [Color], [Size] ) IN { ( "Black", "L" ) }
  4. )

  5. FILTER (
  6.     SUMMARIZE ( DimProduct, [Color], [Size] ),
  7.     CONTAINSROW ( { ( "Black", "L" ) }, [Color], [Size] )
  8. )
复制代码
不具有数据沿袭



在创建内联表表构造器一节介绍过,表构造器结果是一个数据类型,但是它没有任何与数据库底层列相对应的数据沿袭。因此,如果在 CALCULATE 中应用表构造器作为筛选器参数,不会执行任何筛选。
回复

使用道具 举报

polo | 2021-4-24 15:01:52 来自手机 | 显示全部楼层
支持你哈...................................
回复

使用道具 举报

canape | 2021-8-22 12:43:29 | 显示全部楼层
支持楼主,用户楼主,楼主英明呀!!!
回复

使用道具 举报

2110495 | 2021-9-4 22:29:28 来自手机 | 显示全部楼层
回个帖子支持一下!
回复

使用道具 举报

粟米 | 2021-9-27 22:12:46 来自手机 | 显示全部楼层
云发教育是我遇到最好的机构,和其他机构有本质区别
回复

使用道具 举报

mm999 | 2021-9-29 07:44:18 来自手机 | 显示全部楼层
太棒了,感谢唐楼主精彩的分享
回复

使用道具 举报

zgfzgf | 2021-10-19 09:00:19 来自手机 | 显示全部楼层
支持,一直很喜欢老师的课程
回复

使用道具 举报

绿谷碧湖 | 2021-10-20 06:53:49 来自手机 | 显示全部楼层
好帖必须得顶起
回复

使用道具 举报

抄起一板砖 | 2021-10-28 15:49:18 | 显示全部楼层
啥玩应呀
回复

使用道具 举报

gl5839 | 2021-11-2 11:48:08 来自手机 | 显示全部楼层
沙发???
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则