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

理解 EXCEPT

EXCEPT 函数实现对两个集合的补集运算,它返回一个表,该表只包含第一参数中的行,不包含第二参数中的行。两个表必须具有相同的列数和数据类型,并且这些列在各自的表中按位置组合。第一参数定义了结果中列的名称(后续参数可以修改返回的行数,但不影响列名):

EXCEPT ( <LeftTable>, <RightTable> )

返回未出现在右侧表中的左侧表的行。

参数 属性 描述
LeftTable EXCEPT 运算使用的左表表达式.
RightTable EXCEPT 运算使用的右表表达式

EXCEPT 运算图示

注意

  1. 两表的公共行不会包含在结果中,如果一行仅出现在 LeftTable 中,则该行及其重复项都将出现在结果集中。
  2. 结果中的列名与 LeftTable 中的列名匹配。
  3. 返回的表具有基于 LeftTable 中的列的沿袭,与第二个表中的列的沿袭无关。
  4. 用作参数的两个表必须具有相同的列数。
  5. 列的比较基于位置,数据比较没有强制类型转换。
  6. 返回的行集取决于两个表达式的顺序。
  7. 返回的表不包括与 LeftTable 相关的表的列,也就是不支持扩展表理论

示例用法

EXCEPT 结果保留两个参数中第一个表的沿袭。例如,以下查询保留了数据模型中物理列的沿袭,即使第二个表不具有相同沿袭

EVALUATE
EXCEPT (
    VALUES ( Product[Color] ),
    UNION (
        ROW ( "Color", "Red" ),
        ROW ( "Color", "Blue" )
    )
)

以下查询计算在 2008 年购买了某个产品(代码 0202011)且没有购买另一个产品(代码 0201038)的客户:

EVALUATE
CALCULATETABLE (
    VALUES ( Customer[Customer Code] ),
    EXCEPT (
        CALCULATETABLE (
            SUMMARIZE (
                Sales,
                Customer[CustomerKey]
            ),
            'Date'[Calendar Year Number] = 2008,
            Product[Product Code] = "0202011"
        ),
        CALCULATETABLE (
            SUMMARIZE (
                Sales,
                Customer[CustomerKey]
            ),
            'Date'[Calendar Year Number] = 2008,
            Product[Product Code] = "0201038"
        )
    )
)

不适用扩展表

EXCEPT 的结果不适用扩展表理论,即使结果表具备数据沿袭,你也无法将其作为筛选上下文筛选关系一端的表。这是一种特殊情形,与 EXCEPT 类似的还有 UNIONINTERSECT,它们在筛选上下文中仅筛选自身包含的列,不涉及扩展表

4
说点什么

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

老师请教个问题,我想实现在切片器选择哪个项目,就不显示这个项目的数据,显示其他项目数据,我些了如图所示的公式,请问我用了except为什么会在切片器选择那个就是那个数据

679a1027ce1cf6369b7220dd7b6d925.png
成员
GOGOGO

我在想是不是我们数据集不同,因为我检查了我的Sales,在2008年没有一单0201038的单子

DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数