[已解决] [PowerBI]ALLEXCEPT在扩展表中表现错误

  [复制链接]
教授 | 2020-9-16 07:23:53 | 显示全部楼层
更正一下第3步表述,上下文A并不会参与Intersect运算,因为上下文A不会影响维度表的计算。


特别感谢版主与@张文洲,以及回复我的各位大佬给我的启发,以下是我根据各位的建议做的初步结论:

Allexcept跟All一样有两种用法——作为Removefilter和(在需要的时候)返回一张表。
第一种作为Removefilter,它清除"除了排除参数之外的"所有在(第一参数的)扩展表中的列的筛选器,也就是它字面上的用法——只保留特定列的筛选器而清除其他的。
第二种返回一张表,它清除/忽视一切(第一参数的)扩展表中的筛选器——即如果某列没有被排除,那么它的筛选器被清除;如果某列被排除,那么它的筛选器被忽略(不接受),最终都是不起任何作用。
对于返回表的情况,它返回的是一种特殊的表,这个表只含扩展表中没有被排除的列,但这个不完整的表依然(尽量)保留扩展表的属性,例如依然可以实现从事实表到维度表的筛选——只要别把整个维度/事实表都排除掉就好。
以下是我的测试方法,建议配合DAX Studio使用:

写法一
接受外部筛选时,结果集只有39行,因为结果表不能有重名列,直接用Data不行,索性用selectcolumns挨个重命名了……
  1. EVALUATE

  2. GENERATE (

  3.   VALUES ( Data[Name] ),

  4.   CALCULATETABLE (

  5.   SELECTCOLUMNS (

  6.     Data,

  7.     "Data[newName]", Data[Name],

  8.     "Data[newType]", data[Type],

  9.     "Data[newDatetime]", Data[Datetime],

  10.     "Data[newamount]", Data[amount]

  11.   )

  12.   )

  13. )
复制代码



写法二
此结果集有10个Name*39行记录=390行,可见Allexcept没有接受Name列筛选,即它在排除某参数的同时忽略(或者说拒绝?)了该参数上的筛选器,同时清除了其他列的筛选器。
此结果集有四列,结构与原Data相同,即Allexcept返回的结果表中只有三列,确实少了一列。
  1. EVALUATE

  2. GENERATE (

  3.   VALUES ( Data[Name] ),

  4.   CALCULATETABLE ( ALLEXCEPT ( Data, Data[Name] ) )

  5. )
复制代码



简化上面一种写法,虽然没有使用Calculatetable,但Generate对第二参数的要求使得Allexcept不得不返回了一张表(也就是官方说的when required,只要有需要就会返回表),结果与上面完全相同。
  1. EVALUATE

  2. GENERATE ( VALUES ( Data[Name] ), ALLEXCEPT ( Data, Data[Name] ) )
复制代码



写法二的参考一
由于有排除参数,Allexcept返回的结果表已经不是完整的表了,那么这个不完整表是否依然具有扩展表的属性呢?为此我只留了一个amount列,其他通通排除。
如果有,那么此处结果应当是38行,因为原Data表39行中有38个不重复日期。
结果确实是38行。
  1. EVALUATE

  2. CALCULATETABLE ( 'Date', CALCULATETABLE ( ALLEXCEPT ( Data, Data[Name],Data[Datetime],Data[Type] ) ) )
复制代码
这里我又尝试追加排除一列'Date[Date]',也就是最后的扩展表只剩Data[amount]与Date[YearMonth]两列,此时的计算结果有334行,因为在Data中当前有效的amount是39个(等于原Data行数),他们对应11个不同的[YearMonth],把这11个值作为有效值,拿去筛选Date表,得到的就是334行。这个例子再一次印证了返回表具有扩展表的属性(“尽量”保留)。

写法二的参考二
以下可以任意排除列(当然至少保留Data四列中的一列以及Date两列中的一列),筛选任意列(只要属于Data扩展表,无论是否被排除,也无论筛选条件多么奇怪),可以看到结果都是不变的——说明Allexcept无视扩展表中的一切筛选器。
  1. EVALUATE

  2. CALCULATETABLE (

  3.   'Date',

  4.   CALCULATETABLE (

  5.   ALLEXCEPT ( Data, Data[Name] ),

  6.   Data[Name] = "Tom",

  7.   'Date'[YearMonth] = 1

  8.   )

  9. )
复制代码



到此为止,再回头去看原题,应该可以说是水到渠成,无需多言的了——至于最好的解法,版主已经提供了。

最后附上测试文件与DAX Studio文件的打包:
9884012122525.rar (64.3 KB, 下载次数: 0)
回复

使用道具 举报

tian_junwei | 2021-5-18 11:30:36 | 显示全部楼层
我是个凑数的。。。
回复

使用道具 举报

都市狂飚 | 2021-7-15 06:53:02 来自手机 | 显示全部楼层
啥玩应呀
回复

使用道具 举报

飞渡33 | 2021-10-3 13:13:52 来自手机 | 显示全部楼层
打酱油的人拉,回复下赚取积分
回复

使用道具 举报

运奇 | 2021-11-6 08:45:19 来自手机 | 显示全部楼层
打酱油的人拉,回复下赚取积分
回复

使用道具 举报

worldtansun | 2021-11-10 19:56:24 来自手机 | 显示全部楼层
不错 支持一个了
回复

使用道具 举报

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

使用道具 举报

cwd321244 | 2021-11-17 22:24:03 | 显示全部楼层
我也来支持一下,这里的老师和其他机构不一样,其他就是让付费。
回复

使用道具 举报

zhoubaozhoubao | 2021-11-19 19:07:58 来自手机 | 显示全部楼层
努力,努力,再努力!!!!!!!!!!!
回复

使用道具 举报

wangzhe8054 | 2021-12-5 17:41:40 | 显示全部楼层
云发教育是我遇到最好的机构,和其他机构有本质区别
回复

使用道具 举报

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

本版积分规则