Visual上的任何一行或一列都是一個(gè)過(guò)濾上下文,切片器也是一個(gè)過(guò)濾上下文,或者報(bào)表上其他類型的過(guò)濾器,甚至Visual之間的交互,這些過(guò)濾上下文共同構(gòu)成了一個(gè)單元格的過(guò)濾上下文。總的來(lái)說(shuō),報(bào)表的每個(gè)元素都可以創(chuàng)建過(guò)濾上下文,并且報(bào)表的每個(gè)單元格都有不同的過(guò)濾上下文。總結(jié)來(lái)說(shuō),篩選上下文是在報(bào)表中創(chuàng)建的,DAX中只有CALCULATE和CALCULATETABLE兩個(gè)函數(shù)可以創(chuàng)建篩選上下文。
篩選上下文自動(dòng)利用關(guān)系,篩選上下文自動(dòng)通過(guò)關(guān)系來(lái)傳遞,篩選上下文傳遞的方向是關(guān)系的關(guān)系。篩選上下文會(huì)篩選整個(gè)數(shù)據(jù)模型,也就是說(shuō),一旦應(yīng)用了篩選上下文,整個(gè)數(shù)據(jù)模型將會(huì)根據(jù)關(guān)系進(jìn)行篩選。
DAX中最容易引起誤解的一個(gè)函數(shù)是FILTER函數(shù),它是一個(gè)迭代函數(shù),不會(huì)修改篩選上下文,該函數(shù)受到篩選上下文的影響,并根據(jù)條件返回?cái)?shù)據(jù)的子集。修改篩選上下文的函數(shù)有多種,ALL系列函數(shù)是其中的一類函數(shù),用于清除篩選上下文。
通常來(lái)說(shuō),DAX中的篩選上下文由三部分構(gòu)成:關(guān)系,查詢上下文中的單元格(每行的列值)以及報(bào)表元素之間的交互構(gòu)成的過(guò)濾,外部切片器構(gòu)成的顯式過(guò)濾。
1,關(guān)系
在數(shù)據(jù)模型中創(chuàng)建關(guān)系,指定交叉過(guò)濾器,作為篩選上下文的組成部分,因此,篩選上下文自動(dòng)使用關(guān)系,并且根據(jù)關(guān)系所設(shè)置的交叉過(guò)濾器方向,產(chǎn)生不同的行為。由于數(shù)據(jù)模型中關(guān)系的存在,因此篩選上下文會(huì)篩選整個(gè)數(shù)據(jù)模型。
2,查詢上下文
在當(dāng)前查詢的上下文中,每行的列值也會(huì)作為過(guò)濾器,例如,ProductCategoryName和Color是當(dāng)前查詢上下文的行過(guò)濾器:
報(bào)表元素之間的交互也會(huì)構(gòu)成過(guò)濾,影響其他單元格的值。
3,外部切片器
在報(bào)表中設(shè)置的切片器,是在查詢上下文外部的設(shè)置的過(guò)濾器,例如,上圖中的Color切片器就是外部切片器。
Filter函數(shù)不改變篩選上下文,F(xiàn)ilter函數(shù)是一個(gè)迭代函數(shù),它掃描一個(gè)已經(jīng)被篩選上下文過(guò)濾后的表,根據(jù)<filter>參數(shù)返回該表的子集。<filter>是一個(gè)bool表達(dá)式,對(duì)<table>的每一行進(jìn)行判斷,返回結(jié)果為True的數(shù)據(jù)行。
FILTER(<table>,<filter>)
參數(shù)是布爾表達(dá)式,用于逐行執(zhí)行,對(duì)表進(jìn)行過(guò)濾,返回條件為True的行,而移除條件為False的行,例如:
FILTER(FactSales, [Amount] > 0 or [Region] = "France")
此函數(shù)不會(huì)單獨(dú)使用,通常需要結(jié)合迭代函數(shù)和CALCULATE函數(shù)來(lái)使用,它的用法需要深刻理解CALCULATE函數(shù)過(guò)濾上下文。
對(duì)于以下的DAX表達(dá)式,F(xiàn)ilter函數(shù)內(nèi)嵌在CALCULATE函數(shù),并在已有的過(guò)濾上下文中對(duì)表[Product]表進(jìn)行過(guò)濾。CALCULATE 函數(shù)接受 FILTER 函數(shù)返回的表表達(dá)式,F(xiàn)ILTER 函數(shù)針對(duì) Product 表的每一行計(jì)算其過(guò)濾器表達(dá)式,只返回Color為Red的數(shù)據(jù)行:
Red Sales = CALCULATE( [Sales], FILTER('Product', 'Product'[Color] = "Red") )
這個(gè)Measure的等價(jià)寫法如下,雖然結(jié)果是相同的,但是第二種寫法的性能更高,它使用布爾表達(dá)式而不是表表達(dá)式。 KEEPFILTERS 函數(shù)確保應(yīng)用到Color列的任何現(xiàn)有過(guò)濾器都被保留,而不是被覆蓋。
Red Sales2 = CALCULATE( [Sales], KEEPFILTERS('Product'[Color] = "Red") )
參考文檔:
聯(lián)系客服