4.4 了解FILTER,ALL和上下文交互

了解FILTER,ALL和上下文交互

在前面的示例中,我們使用FILTER作為篩選表的便捷方法。FILTER是一項(xiàng)常見功能,可在需要進(jìn)一步限制現(xiàn)有篩選上下文的篩選時(shí)使用。

想象一下,我們要?jiǎng)?chuàng)建一個(gè)計(jì)算紅色產(chǎn)品數(shù)量的度量值。利用目前為止獲得的知識(shí),公式很簡單:

NumOfRedProducts :=
VAR RedProducts =
 FILTER (
 'Product',
 'Product'[Color] = "Red"
 )
RETURN
 COUNTROWS ( RedProducts )</pre>

我們可以在報(bào)表中使用此公式。例如,將產(chǎn)品品牌放在行上以生成如圖4-14所示的報(bào)告。

圖4-14 使用FILTER功能來計(jì)算紅色產(chǎn)品的數(shù)量

在繼續(xù)進(jìn)行本示例之前,請(qǐng)稍等片刻,仔細(xì)考慮DAX如何計(jì)算這些值。品牌是產(chǎn)品表的一列。在報(bào)表的每個(gè)單元格中,篩選上下文篩選一個(gè)給定的品牌。因此,每個(gè)單元格顯示給定品牌產(chǎn)品的數(shù)量也為紅色。原因是FILTER會(huì)在當(dāng)前篩選上下文中可見的情況下對(duì) Product 表進(jìn)行迭代,該表僅包含具有該特定品牌的產(chǎn)品。似乎微不足道,但是最好重復(fù)幾次,而不要忘記它。

如果我們?cè)趫?bào)告中添加切片器以篩選顏色,則這一點(diǎn)更加明顯。在圖4-15中,有兩個(gè)完全相同的報(bào)告,都帶有篩選顏色的切片器,其中每個(gè)切片器僅在其緊鄰的右邊篩選報(bào)告。左側(cè)的報(bào)告篩選紅色,數(shù)字與圖4-14相同,而右側(cè)的報(bào)告為空,因?yàn)榍衅髡谶^濾Azure

DAX在考慮切片器定義的外部上下文的情況下評(píng)估NumOfRedProducts

有兩個(gè)報(bào)告。在左側(cè),我們看到每個(gè)產(chǎn)品的NumOfRedProducts值,并且切片器將焦點(diǎn)放在Red上。在右側(cè),切片器將重點(diǎn)放在Azure上,并且報(bào)告為空。

在右側(cè)的報(bào)告中,由FILTER迭代的 Product 表僅包含Azure產(chǎn)品,并且由于FILTER只能返回Red產(chǎn)品,因此沒有要返回的產(chǎn)品。結(jié)果,NumOfRedProducts度量值始終評(píng)估為空白。

此示例的重要部分在于,在同一公式中,既有來自外部的篩選上下文——受切片器選擇影響的報(bào)表中的單元格,也有公式中FILTER函數(shù)引入的行上下文。這兩個(gè)上下文同時(shí)工作并修改結(jié)果。在FILTER進(jìn)行的迭代過程中,DAX使用篩選上下文評(píng)估 Product 表,并使用行上下文逐行評(píng)估篩選條件。

我們想再次重復(fù)這個(gè)概念:FILTER不會(huì)更改篩選上下文。FILTER是一個(gè)迭代函數(shù),它掃描表(已由篩選上下文篩選),并根據(jù)篩選條件返回該表的子集。在圖4-14中,篩選上下文正在篩選品牌,在FILTER返回結(jié)果之后,它仍然僅篩選品牌。在圖4-15中將切片器添加到顏色之后,篩選上下文同時(shí)包含品牌和顏色。因此,FILTER在左側(cè)報(bào)告中返回了所有迭代的產(chǎn)品,而在右側(cè)報(bào)告中未返回任何產(chǎn)品。在這兩個(gè)報(bào)告中,FILTER均未更改篩選上下文。FILTER僅掃描表并返回篩選結(jié)果。

此時(shí),可能需要定義另一個(gè)公式,該公式返回紅色乘積的數(shù)量,而不管在切片器上進(jìn)行的選擇如何。換句話說,代碼需要忽略在切片器上所做的選擇,并且必須始終返回所有紅色乘積的數(shù)量。

為此,可以使用ALL功能。ALL返回忽略篩選上下文的表的內(nèi)容。我們可以使用以下表達(dá)式定義一個(gè)名為NumOfAllRedProducts的新度量值:

NumOfAllRedProducts :=
VAR AllRedProducts =
 FILTER (
 ALL ( 'Product' ),
 'Product'[Color] = "Red"
 )
RETURN
 COUNTROWS ( AllRedProducts )

這次,FILTER不迭代產(chǎn)品。而是,迭代ALL(Product)。* ALL會(huì)忽略篩選上下文,并始終返回表的所有行,因此FILTER*會(huì)返回紅色產(chǎn)品,即使先前已使用其他品牌或顏色篩選的產(chǎn)品也是如此。 盡管正確,但圖4-16中所示的結(jié)果可能令人驚訝。

圖4-16 NumOfAllRedProducts返回奇怪的結(jié)果

同樣,左側(cè)的報(bào)告?zhèn)戎赜诩t色,右側(cè)的報(bào)告?zhèn)戎赜谔焖{(lán)色。這次在右側(cè)的NumOfAllRedProducts下有一個(gè)值。 。

這里需要注意幾個(gè)有趣的事情,我們想更詳細(xì)地描述兩者:

  • 無論行上選擇的品牌如何,結(jié)果始終為99。

  • 左矩陣與右矩陣中的品牌不同。

首先,紅色產(chǎn)品的總數(shù)為99,而不是任何給定品牌的紅色產(chǎn)品的數(shù)量——如預(yù)期的那樣,是所有產(chǎn)品,忽略了產(chǎn)品表上的篩選。它不僅忽略了顏色上的篩選,而且忽略了品牌上的篩選,這可能是不希望的效果。盡管如此,ALL既簡單又強(qiáng)大,是一個(gè)全有或全無的函數(shù)。如果使用,ALL將忽略應(yīng)用于作為其參數(shù)指定的表的所有篩選。運(yùn)用到目前為止您已經(jīng)掌握的知識(shí),還不能選擇僅忽略篩選的一部分。在該示例中,最好只忽略顏色上的篩選。只有在下一章介紹了CALCULATE之后,您才有更好的選擇來實(shí)現(xiàn)對(duì)篩選的選擇性忽略。

現(xiàn)在讓我們描述第二點(diǎn):兩個(gè)報(bào)告上的品牌不同。由于切片器正在篩選一種顏色,因此將使用該顏色上的篩選來計(jì)算整個(gè)矩陣。左邊的顏色是Red,而右邊的顏色是Azure。這確定了兩組不同的產(chǎn)品,進(jìn)而確定了品牌。用于填充報(bào)告軸的品牌列表是在原始篩選上下文中計(jì)算的,該篩選上下文中包含顏色篩選。一旦計(jì)算了軸,DAX將計(jì)算該度量值,無論品牌和顏色如何,結(jié)果始終返回99。因此,左側(cè)的報(bào)告顯示了紅色產(chǎn)品的品牌,而右側(cè)的報(bào)告顯示了天藍(lán)色產(chǎn)品的品牌,盡管在這兩個(gè)報(bào)告中,度量值均顯示了所有紅色產(chǎn)品的總數(shù),而與品牌無關(guān)。

注意
報(bào)表的行為并不特定于DAX,而是特定于Power BI使用的SUMMARIZECOLUMNS函數(shù)。我們將在第13章“編寫查詢”中介紹SUMMARIZECOLUMNS。

我們現(xiàn)在不希望進(jìn)一步探討這種情況。當(dāng)您學(xué)習(xí)CALCULATE時(shí),該解決方案就會(huì)出現(xiàn),它為處理篩選上下文提供了更多的功能(和復(fù)雜性)。到目前為止,我們已經(jīng)使用該示例說明了由于上下文交互以及在同一表達(dá)式中篩選和行上下文的共存,您可能會(huì)從相對(duì)簡單的公式中發(fā)現(xiàn)意外結(jié)果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 在之前的案例中,我們使用了filter來過濾一個(gè)表格。filter是非常常用的函數(shù),當(dāng)你想用來進(jìn)一步限制上下文?,F(xiàn)...
    PowerBI入門到實(shí)踐閱讀 2,260評(píng)論 0 6
  • 第4章了解評(píng)估上下文 4.1 介紹評(píng)估上下文 到此,您已經(jīng)學(xué)習(xí)了DAX語言的基礎(chǔ)知識(shí)。您知道如何創(chuàng)建計(jì)算列和度量值...
    jweishan閱讀 963評(píng)論 0 1
  • 到本書的這一章時(shí),您已經(jīng)學(xué)習(xí)了DAX語言的基礎(chǔ)知識(shí)。您知道如何創(chuàng)建計(jì)算列和度量值,并且您已經(jīng)很好地理解了DAX中的...
    daxbi閱讀 6,676評(píng)論 4 28
  • 在迭代函數(shù)中使用行上下文 您了解到,無論何時(shí)定義計(jì)算列或使用X函數(shù)開始迭代時(shí),DAX都會(huì)創(chuàng)建行上下文。當(dāng)我們使用計(jì)...
    jweishan閱讀 1,440評(píng)論 0 2
  • 發(fā)券 一看開關(guān)打開否, 二看規(guī)則下發(fā)否, 三看規(guī)則滿足否, 四看日志報(bào)錯(cuò)否, 六看接口調(diào)用否, 劉看規(guī)則滿足否。 ...
    Sweety_202e閱讀 315評(píng)論 0 0