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