第3章 使用基本表函數(shù)
理解FILTER
既然我們已經(jīng)介紹了表函數(shù)是什么,那么現(xiàn)在就該全面闡述基本表函數(shù)了。實(shí)際上,通過組合和嵌套基本函數(shù),您已經(jīng)可以計(jì)算出許多強(qiáng)大的表達(dá)式。您學(xué)習(xí)的第一個(gè)函數(shù)能是FILTER。
FILTER的語法如下:
FILTER ( <table>, <condition> )
FILTER接收一個(gè)表和一個(gè)邏輯條件作為參數(shù)。結(jié)果,FILTER返回所有滿足條件的行。FILTER同時(shí)是表函數(shù)和迭代函數(shù)。為了返回結(jié)果,它逐行掃描評(píng)估條件的表。換句話說,它對(duì)表進(jìn)行迭代。 例如,以下計(jì)算表返回Fabrikam產(chǎn)品(Fabrikam是品牌)。
FabrikamProducts =
FILTER (
'Product',
'Product'[Brand] = "Fabrikam"
)
FILTER通常用于減少迭代中的行數(shù)。例如,如果開發(fā)人員想要計(jì)算紅色產(chǎn)品的銷售量,則他們可以編寫如下度量值:
RedSales :=
SUMX (
FILTER (
Sales,
RELATED ( 'Product'[Color] ) = "Red"
),
Sales[Quantity] * Sales[Net Price]
)
您可以在圖3-2中看到結(jié)果,連同總銷售額。
度量值RedSales是在Sales表的子集(即與紅色產(chǎn)品相關(guān)的一組銷售)中進(jìn)行迭代的度量值。FILTER將條件添加到現(xiàn)有條件中。例如,RedSales“音頻”行中顯示既是“音頻”類別又是紅色產(chǎn)品的銷售情況。
可以將FILTER嵌套在另一個(gè)FILTER函數(shù)中。通常,嵌套兩個(gè)FILTER產(chǎn)生的結(jié)果與將兩個(gè)FILTER函數(shù)與AND函數(shù)組合在一起的結(jié)果相同。換句話說,以下兩個(gè)查詢產(chǎn)生相同的結(jié)果:
FabrikamHighMarginProducts =
FILTER (
FILTER (
'Product',
'Product'[Brand] = "Fabrikam"
),
'Product'[Unit Price] > 'Product'[Unit Cost] * 3
)
FabrikamHighMarginProducts =
FILTER (
'Product',
AND (
'Product'[Brand] = "Fabrikam",
'Product'[Unit Price] > 'Product'[Unit Cost] * 3
)
)
但是,對(duì)于大表來說,條件的選擇性不同,性能有所不同。如果一個(gè)條件比另一個(gè)條件更具選擇性,則首先使用嵌套FILTER函數(shù)來應(yīng)用最具有選擇性的條件被視為最優(yōu)方法。
例如,如果有很多Fabrikam品牌的產(chǎn)品,但很少有產(chǎn)品的價(jià)格是其成本的三倍,則以下查詢將篩選應(yīng)用于最里面的FILTER中的Unit Price和Unit Cost。這樣,該公式首先應(yīng)用限制性最強(qiáng)的FILTER,以減少檢查品牌所需的迭代次數(shù):
FabrikamHighMarginProducts =
FILTER (
FILTER (
'Product',
'Product'[Unit Price] > 'Product'[Unit Cost] * 3
),
'Product'[Brand] = "Fabrikam"
)
使用FILTER,開發(fā)人員通常可以生成易于閱讀和易于維護(hù)的代碼。例如,假設(shè)您需要計(jì)算紅色產(chǎn)品的數(shù)量。在不使用表函數(shù)的情況下,可能的實(shí)現(xiàn)方式如下:
NumOfRedProducts :=
SUMX (
'Product',
IF ( 'Product'[Color] = "Red", 1, 0 )
)
內(nèi)部IF返回取決于產(chǎn)品的顏色是1還是0,并將此表達(dá)式求和將返回紅色產(chǎn)品的數(shù)量。盡管有效,但是此代碼有些棘手。下面是對(duì)相同度量的一個(gè)更好的實(shí)現(xiàn):
NumOfRedProducts :=
COUNTROWS (
FILTER ( 'Product', 'Product'[Color] = "Red" )
)
后面的表達(dá)式更好地顯示了開發(fā)人員想要獲得的東西。此外,代碼不僅使人更容易閱讀,而且DAX優(yōu)化器還能夠更好地理解開發(fā)人員的意圖。因此,優(yōu)化器產(chǎn)生了更好的查詢計(jì)劃,從而帶來了更好的性能。