第3章 使用基本表函數(shù)
3.1 表函數(shù)簡(jiǎn)介
3.2 EVALUATE語(yǔ)法簡(jiǎn)介
3.3 理解FILTER
3.4 ALL和ALLEXCEPT
3.5 了解VALUES,DISTINCT和空行
3.6 將表用作標(biāo)量值
3.7 ALLSELECTED介紹
在本章中,您將學(xué)習(xí)DAX中可用的基本表函數(shù)。表函數(shù)是常規(guī)的DAX函數(shù),表函數(shù)返回表而不是返回單個(gè)值。在編寫(xiě)DAX查詢和許多需要對(duì)表進(jìn)行迭代的高級(jí)計(jì)算時(shí),表函數(shù)很有用。本章包含此類計(jì)算的幾個(gè)示例。
本章的目的是介紹表函數(shù)的概念,而不是提供DAX中所有表函數(shù)的詳細(xì)說(shuō)明。第12章“使用表”和第13章“編寫(xiě)查詢”中包含大量表函數(shù)。這里我們解釋DAX中最常見(jiàn)和最重要的表函數(shù),以及如何在常見(jiàn)情況下包括在DAX標(biāo)量表達(dá)式中使用表函數(shù)。
表函數(shù)簡(jiǎn)介
到現(xiàn)在為止,您已經(jīng)看到DAX表達(dá)式通常返回單個(gè)值,例如字符串或數(shù)字。結(jié)果為單個(gè)值的表達(dá)式稱為標(biāo)量表達(dá)式。定義度量值或計(jì)算列時(shí),請(qǐng)始終編寫(xiě)標(biāo)量表達(dá)式,如下所示:
= 4 + 3
= "DAX is a beautiful language"
= SUM ( Sales[Quantity] )
實(shí)際上,度量值的主要目標(biāo)是產(chǎn)生在報(bào)表、數(shù)據(jù)透視表或圖表中呈現(xiàn)的結(jié)果。歸根結(jié)底,所有這些報(bào)告的來(lái)源都是一個(gè)數(shù)字,換句話說(shuō),就是一個(gè)標(biāo)量表達(dá)式。不過(guò),在標(biāo)量值計(jì)算的過(guò)程中,您可能會(huì)使用表。例如,以下的簡(jiǎn)單迭代中將一張表用于計(jì)算銷售額:
Sales Amount := SUMX ( Sales, Sales[Quantity] * Sales[Net Price] )
在以上示例中,SUMX遍歷Sales表。因此,盡管完整計(jì)算的結(jié)果是標(biāo)量值,但是在計(jì)算過(guò)程中,該公式會(huì)掃描Sales表。像下面的代碼一樣,相同的代碼可以迭代表函數(shù)的結(jié)果。此代碼僅計(jì)算數(shù)量大于一的行的銷售額:
Sales Amount Multiple Items :=
SUMX (
FILTER (
Sales,
Sales[Quantity] > 1
),
Sales[Quantity] * Sales[Net Price]
)
在此示例中,我們使用FILTER函數(shù)代替對(duì)Sales的引用。直觀上,F(xiàn)ILTER是一種根據(jù)條件篩選表內(nèi)容的函數(shù)。稍后我們將詳細(xì)描述FILTER。現(xiàn)在,請(qǐng)務(wù)必注意,只要是在引用表的地方,就可以用表函數(shù)來(lái)替代表。
在前面的代碼中,您看到了一個(gè)用于求和匯總的篩選函數(shù)。這不是最佳實(shí)踐。在下一章中,將學(xué)習(xí)如何使用CALCULATE來(lái)實(shí)現(xiàn)更靈活和有效的篩選。本章中示例的目的不是提供DAX度量值的最佳實(shí)例,而是說(shuō)明表函數(shù)如何使用簡(jiǎn)單的表達(dá)式工作。稍后,我們將在更復(fù)雜的場(chǎng)景中應(yīng)用這些概念。
此外,在第2章“ DAX簡(jiǎn)介”中,您了解了可以將變量定義為DAX表達(dá)式的一部分,在那里,我們使用變量來(lái)存儲(chǔ)標(biāo)量值。但是,變量也可以存儲(chǔ)表。例如,可以通過(guò)使用變量以以下方式編寫(xiě)先前的代碼:
Sales Amount Multiple Items :=
VAR
MultipleItemSales = FILTER ( Sales, Sales[Quantity] > 1 )
RETURN
SUMX (
MultipleItemSales,
Sales[Quantity] * Sales[Unit Price]
)
MultipleItemSales是一個(gè)存儲(chǔ)整個(gè)表的變量,因?yàn)槠浔磉_(dá)式是表函數(shù)。我們強(qiáng)烈建議盡可能使用變量,這樣代碼更易于閱讀。簡(jiǎn)單地為表達(dá)式指定個(gè)名稱,您已經(jīng)在很好地編寫(xiě)代碼了。
在計(jì)算列中或在迭代中,還可以使用RELATEDTABLE函數(shù)檢索相關(guān)表的所有行。例如,Product表中的以下計(jì)算列用于計(jì)算相應(yīng)產(chǎn)品的銷售額:
'Product'[Product Sales Amount] =
SUMX (
RELATEDTABLE ( Sales ),
Sales[Quantity] * Sales[Unit Price]
)
表函數(shù)也可以嵌套。例如,以下Product表中計(jì)算列計(jì)算銷售數(shù)量大于一的產(chǎn)品銷售額:
'Product'[Product Sales Amount Multiple Items] =
SUMX (
FILTER (
RELATEDTABLE ( Sales ),
Sales[Quantity] > 1
),
Sales[Quantity] * Sales[Unit Price]
)
在示例代碼中,相關(guān)表嵌套在篩選中。通常,當(dāng)存在嵌套調(diào)用時(shí),DAX首先評(píng)估最內(nèi)層函數(shù),然后評(píng)估其他函數(shù)直至最外層函數(shù)。
如您將在后面看到的,嵌套調(diào)用的執(zhí)行順序可能會(huì)引起混亂,因?yàn)?em>CALCULATE和CALCULATETABLE的評(píng)估順序與FILTER不同。下一節(jié),您將學(xué)習(xí)FILTER的行為。在第5章“了解CALCULATE和CALCULATETABLE”中可找到CALCULATE和CALCULATETABLE的描述。
通常,我們不能將表函數(shù)的結(jié)果用作度量值或計(jì)算列的值。度量值和計(jì)算列均要求表達(dá)式為標(biāo)量值。相反,我們可以將表表達(dá)式的結(jié)果分配給計(jì)算表。計(jì)算表是一種表,其值由DAX表達(dá)式確定,而不是從數(shù)據(jù)源加載。
例如,我們可以使用如下表表達(dá)式創(chuàng)建一個(gè)包含所有單價(jià)大于3,000的產(chǎn)品的計(jì)算表:
ExpensiveProducts =
FILTER (
'Product',
'Product'[Unit Price] > 3000
)
計(jì)算表在Power BI和Analysis Services中可用,但在Power Pivot for Excel中不可用(截至2019年)。使用表函數(shù)的次數(shù)越多,在度量值中使用計(jì)算表和/或復(fù)雜的表表達(dá)式來(lái)創(chuàng)建更復(fù)雜的數(shù)據(jù)模型就越多。