PowerBI之行上下文和筛选上下文 · 2

 

参考资料:https://www.powerbigeek.com/understanding-allselected-function/

这篇文章关于ALLSELECTED的原理描述参考上述链接,根据自己的理解总结而成,与上述链接并不完全一致,并不保证自己的理解完全正确,但在试验中这样子理解是没有问题的。

一张“sheet”表如下。

建几个度量值,并放入矩阵中:

sum =SUM(sheet[value])

all =CALCULATE([sum],ALL(sheet[color]))

allselected =CALCULATE([sum],ALLSELECTED(sheet[color]))

allexcept = CALCULATE([sum],ALLEXCEPT(sheet,sheet[brand]))

可以看到‘sum’度量值是受切片器color,行标签brand和行标签color筛选后的计算,

而‘all’和‘allexcept’的结果一致,是移除color筛选器(包括切片器和行标签)后的计算,此时只有行标签brand筛选器存在,

而‘allselected’是移除了行标签color筛选器后的计算,此时切片器color和行标签brand筛选器仍然存在。


all表=CALCULATE([sum],ALL(sheet))


allselected表=CALCULATE([sum],ALLSELECTED(sheet))

可以看到‘all表’度量值移除了切片器color、行标签color、行标签brand筛选器,也就是移除了对sheet表的所有筛选器,

而‘allselected表’度量值移除了所有筛选器,但是保留了切片器所在的筛选器。


总结:当DAX表达式不是很复杂时(没有多层嵌套),可以简单的理解为:

ALL(列名)是移除表上指定的列名所包括的筛选器(包括切片器和行列标签),

ALL(表名)是移除表上的所有筛选器(包括切片器和行列标签),

ALLEXCEPT(表名,列名)是移除表上的所有筛选器(包括切片器和行列标签),只保留指定列名包括的筛选器,

ALLSELECTED(列名)是移除指定列的筛选器,但是保留切片器筛选器,

ALLSELECTED(表名)是移除所有筛选器,除了切片器筛选器。

但是当DAX表达式有多层嵌套时,就会发现这样理解是不够正确的。


首先理解交叉筛选:

图中没有对product列应用任何筛选器,只有切片器color筛选器,但是通过切片器,仍然能够对product列进行筛选,此时product列就是受到交叉筛选的影响。


其次,我把筛选器分成两类,一类是用作数据筛选的筛选器,一类是用作数据呈现的筛选器。

如上图所示,矩阵中的product标签就是用作数据呈现的筛选器,而切片器color就是用作数据筛选的筛选器。

我们可以说矩阵中的第一个值有两个筛选条件,一个是color等于green,一个是product等于heimet,事实上数据始终只受了切片器color的影响,筛选出了color等于green的记录,此时我们可以有不同的数据呈现方式,可以按照不同的product去聚合呈现(也就是图中的方式),也可以把数据直接聚合成一个值等等。

矩阵中的行列标签,sumx、filter、addcolumn这些迭代函数(迭代函数的第一参数会创建行上下文,当被封装在calculate中时可以转为筛选上下文,此时它们就是用作数据呈现的筛选器)都是用作数据呈现的筛选器。


ALL、ALLSELECTED、ALLEXCEPT都有两个作用,一是用来移除筛选器(写在calculate的筛选条件里),二是用来返回表(作为filter、sumx等函数的第一参数)。

在接触DAX时我们了解到PowerBI中的数据是以列为形式存储的,同样的移除筛选器也是以列为单位的,ALL这些函数只能移除掉直接应用于该列上的筛选器,而不考虑交叉筛选的影响(比如ALL(sheet[product])可以移除掉'sheet'[product] in

{"shoes","robot"}的筛选,却不能移除掉'sheet'[color] in {"blue","red"}对product列的交叉筛选),并且如果对该列多次应用筛选器,后来的筛选器总会覆盖之前的筛选器。

在复杂的DAX中往往要嵌套好几层条件,它们是有先后顺序的,分开来看的话可以说存在多个筛选出来的记录表,那么移除的是哪张表上的筛选器呢?ALL和ALLSELECTED有不同的回答。


度量值8 = CALCULATE(CALCULATE([sum],ALLSELECTED(sheet[product])),'sheet'[product] in{"shoes","robot"})

度量值9 = CALCULATE(SUM(sheet[value]),'sheet'[product] in{"shoes","robot"})

度量值2 = CALCULATE(CALCULATE([sum],ALL(sheet[product])),'sheet'[product] in{"shoes","robot"})

以打红框的bike这行为例:

先来看‘度量值8’。首先没有切片器的筛选,然后行标签为product列应用了一个筛选器,即product等于bike,在计算时calculate中的条件'sheet'[product] in

{"shoes","robot"}也在product列应用了一个筛选器,这个筛选器无疑会覆盖之前的筛选器,也就是说此时只有product列上有一个筛选器即product等于shoes或robot(暂且把它记为表1,表1中只有product一列),而在calculate的表达式中嵌套了一个calculate,其中的条件是ALLSELECTED(sheet[product]),此时ALLSELECTED的作用是移除表1上的product列的筛选器,这里就得说到ALLSELECTED只移除用作数据呈现的筛选器,显然这里没有,也就是最后只有筛选器表1,根据隐藏的索引列可以找到表1对应的value列,把值加总就是497.

再看‘度量值2’。不同于ALLSELECTED移除的是针对最后一个筛选表的用作数据呈现的筛选器,ALL移除的是针对源表(或源表中的一列)的所有筛选器。首先,切片器没有对源表中的product列应用筛选器,而行标签对源表中的product列应用了一个筛选器即product等于bike,而'sheet'[product] in {"shoes","robot"}覆盖了这个筛选器,也就是此时源表的product列的筛选器为product等于shoes或robot,而ALL(sheet[product])移除了源表product列的所有筛选器,所以此时product列没有任何筛选器,依据product列找到相应的value列的值加总就是2705。


作用是返回表的ALLSELECTED。

ALLSELECTED(product):移除表上的用作数据呈现的筛选器,然后返回此时表中的所有记录。这里显然是没有这类筛选器的,所以返回Product[Color] IN { "Blue", "Green"

},Product[Brand] IN { "Contoso", "Fabrikam" }组成的筛选表,只有四行记录。

ALLSELECTED(product[product]):移除product列上的用于数据呈现的筛选器,然后返回此时该列去重复后的所有值。因为条件中只对color列和brand列应用过筛选器,所以product列的筛选表还是源表的product列,而且这里没有用于数据呈现的筛选器,所以最后返回的是源表中的product列的去重复值,也就是9个产品。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容