EXCEPT 函数实现对两个集合的补集运算,它返回一个表,该表只包含第一参数中的行,不包含第二参数中的行。两个表必须具有相同的列数和数据类型,并且这些列在各自的表中按位置组合。第一参数定义了结果中列的名称(后续参数可以修改返回的行数,但不影响列名):
EXCEPT ( <LeftTable>, <RightTable> )
返回未出现在右侧表中的左侧表的行。
参数 | 属性 | 描述 |
---|---|---|
LeftTable | EXCEPT 运算使用的左表表达式. | |
RightTable | EXCEPT 运算使用的右表表达式 |
注意
- 两表的公共行不会包含在结果中,如果一行仅出现在 LeftTable 中,则该行及其重复项都将出现在结果集中。
- 结果中的列名与 LeftTable 中的列名匹配。
- 返回的表具有基于 LeftTable 中的列的沿袭,与第二个表中的列的沿袭无关。
- 用作参数的两个表必须具有相同的列数。
- 列的比较基于位置,数据比较没有强制类型转换。
- 返回的行集取决于两个表达式的顺序。
- 返回的表不包括与 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 类似的还有 UNION 和 INTERSECT,它们在筛选上下文中仅筛选自身包含的列,不涉及扩展表。
老师请教个问题,我想实现在切片器选择哪个项目,就不显示这个项目的数据,显示其他项目数据,我些了如图所示的公式,请问我用了except为什么会在切片器选择那个就是那个数据
我在想是不是我们数据集不同,因为我检查了我的Sales,在2008年没有一单0201038的单子