第3章 使用基本表函數(shù)
理解FILTER
既然我們已經(jīng)介紹了表函數(shù)是什么,那么現(xiàn)在就該全面闡述基本表函數(shù)了。實(shí)際上隔节,通過(guò)組合和嵌套基本函數(shù),您已經(jīng)可以計(jì)算出許多強(qiáng)大的表達(dá)式寂呛。您學(xué)習(xí)的第一個(gè)函數(shù)能是FILTER怎诫。
FILTER的語(yǔ)法如下:
FILTER ( <table>, <condition> )
FILTER接收一個(gè)表和一個(gè)邏輯條件作為參數(shù)。結(jié)果贷痪,FILTER返回所有滿足條件的行幻妓。FILTER同時(shí)是表函數(shù)和迭代函數(shù)。為了返回結(jié)果呢诬,它逐行掃描評(píng)估條件的表涌哲。換句話說(shuō),它對(duì)表進(jìn)行迭代尚镰。 例如阀圾,以下計(jì)算表返回Fabrikam產(chǎn)品(Fabrikam是品牌)。
FabrikamProducts =
FILTER (
'Product',
'Product'[Brand] = "Fabrikam"
)
FILTER通常用于減少迭代中的行數(shù)狗唉。例如初烘,如果開(kāi)發(fā)人員想要計(jì)算紅色產(chǎn)品的銷(xiāo)售量,則他們可以編寫(xiě)如下度量值:
RedSales :=
SUMX (
FILTER (
Sales,
RELATED ( 'Product'[Color] ) = "Red"
),
Sales[Quantity] * Sales[Net Price]
)
您可以在圖3-2中看到結(jié)果分俯,連同總銷(xiāo)售額肾筐。
度量值RedSales是在Sales表的子集(即與紅色產(chǎn)品相關(guān)的一組銷(xiāo)售)中進(jìn)行迭代的度量值。FILTER將條件添加到現(xiàn)有條件中缸剪。例如吗铐,RedSales“音頻”行中顯示既是“音頻”類(lèi)別又是紅色產(chǎn)品的銷(xiāo)售情況。
可以將FILTER嵌套在另一個(gè)FILTER函數(shù)中杏节。通常唬渗,嵌套兩個(gè)FILTER產(chǎn)生的結(jié)果與將兩個(gè)FILTER函數(shù)與AND函數(shù)組合在一起的結(jié)果相同典阵。換句話說(shuō),以下兩個(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ì)于大表來(lái)說(shuō)壮啊,條件的選擇性不同,性能有所不同撑蒜。如果一個(gè)條件比另一個(gè)條件更具選擇性歹啼,則首先使用嵌套FILTER函數(shù)來(lái)應(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巡莹,開(kāi)發(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á)式更好地顯示了開(kāi)發(fā)人員想要獲得的東西瘸恼。此外,代碼不僅使人更容易閱讀册养,而且DAX優(yōu)化器還能夠更好地理解開(kāi)發(fā)人員的意圖东帅。因此,優(yōu)化器產(chǎn)生了更好的查詢計(jì)劃球拦,從而帶來(lái)了更好的性能靠闭。