關(guān)于列表篩選
? ? ? 前面我們展示了CALCULATE函數(shù)的列表篩選+計(jì)算的參數(shù)構(gòu)成圖°擦耍基于它的最簡(jiǎn)單定義:CALCULATE定義一個(gè)計(jì)算列表集,因而進(jìn)一步可表示為下圖(僅僅將CALCULATE的計(jì)算列表與篩選列表兩部分關(guān)聯(lián)在一起):
? 第14式:CALCULATE的列表(列值)變化
? ? ? 1、至少廉油,該圖示代表了DAX計(jì)算式該有的樣子尖滚,依此脐往,我們簡(jiǎn)單的先理解其含義:從一個(gè)關(guān)系型業(yè)務(wù)數(shù)據(jù)模型里颂郎,引用(查詢)出計(jì)算需要的列表、并構(gòu)建一個(gè)新的數(shù)據(jù)模型的子集(篩選)抖所,然后完成聚合類計(jì)算(計(jì)算)梨州。這就是我們前面所說(shuō)的篩選+計(jì)算。我們通常使用CALCULATE來(lái)定義這句話田轧。
? ? ? 如果你剛從Excel接觸到DAX暴匠,則必須要了解:DAX包含了一些和Excel函數(shù)類似的函數(shù)及用法,但DAX提供了一些專有的函數(shù)和用法傻粘,而且每窖,DAX的計(jì)算原理與Excel是完全不同的帮掉,DAX更強(qiáng)調(diào)列表(列式)的概念,你應(yīng)該避免使用表或單元格的思維模式來(lái)套用DAX(不止一次地說(shuō))窒典。因此蟆炊,DAX一般使用函數(shù)來(lái)操作列表。需要強(qiáng)調(diào)的是:
? ? ? ? 1)如果說(shuō)Excel函數(shù)的計(jì)算是基于單元格的瀑志,那么DAX的計(jì)算是基于列進(jìn)行的涩搓;
? ? ? ? 2)由于Excel與DAX各自的特點(diǎn)和優(yōu)勢(shì)(你可以查看官方文檔了解),更好的使用方式是劈猪,結(jié)合兩者的優(yōu)點(diǎn)昧甘。例如,DAX的列式特點(diǎn)是它的最大優(yōu)勢(shì)战得,但同時(shí)也是它最大的弱點(diǎn):DAX的行概念始終會(huì)讓你費(fèi)解充边。
? ? ? 基于列式運(yùn)算,一個(gè)100萬(wàn)行的列常侦,DAX也許只需要計(jì)算1次浇冰!對(duì),1次就行聋亡。這對(duì)于習(xí)慣于Excel普通表的單元格填充肘习,除了不可思議之外,還無(wú)法理解坡倔。但是井厌,這確是DAX的強(qiáng)大之處。
? ? ? ? DAX的另一個(gè)讓你迷戀的過(guò)人之處還在于可以融合來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)致讥,并構(gòu)成數(shù)據(jù)模型計(jì)算。這是后面要談到的主題:DAX能篩選 +計(jì)算的幕后功臣:列表關(guān)系器赞。這里略垢袱。
? ? ? 2、 既然DAX基于列式運(yùn)算如此的“牛氣”港柜,問(wèn)題是:這是一種粗獷式请契、強(qiáng)調(diào)集團(tuán)作戰(zhàn)式的計(jì)算,目的是盡量發(fā)揮DAX在大規(guī)模數(shù)據(jù)計(jì)算上的優(yōu)勢(shì)夏醉。
? ? ? 但同時(shí)爽锥,我們更希望DAX具備像Excel單元格那樣的行的行為特點(diǎn),即具備細(xì)膩式畔柔、強(qiáng)調(diào)游擊作戰(zhàn)式的按行運(yùn)算氯夷,以確保DAX可以完成更細(xì)致的業(yè)務(wù)邏輯條件計(jì)算。
? ? ? 無(wú)論采用哪種方式靶擦,DAX所能使用的只有列表腮考。因此雇毫,要兼顧前面的兩種行為優(yōu)勢(shì)。需要將列表:列式化處理以及行(單元格)化處理踩蔚,DAX提供了對(duì)應(yīng)的兩種列表形態(tài):列表和值列表棚放。
? ? ? 前面我們說(shuō),應(yīng)該將DAX數(shù)據(jù)模型理解為由一個(gè)個(gè)單列表構(gòu)成馅闽。換句話說(shuō)飘蚯,列表是DAX數(shù)據(jù)模型里的唯一單元值(包含列關(guān)系、列類型等)或元素福也,因此局骤,一個(gè)單列表才是DAX內(nèi)部引擎能識(shí)別的最小單位。
? ? ? ? 所以拟杉,DAX(往往就是CALCULATE)篩選庄涡,通常指得到一個(gè)計(jì)算子集,DAX計(jì)算搬设,則是針對(duì)這個(gè)子集定義的每一行進(jìn)行聚合類計(jì)算(暫時(shí)這樣說(shuō))穴店。
? ? ? 3、通過(guò)前面關(guān)于值列表和列表的介紹拿穴。不難理解泣洞,包含整個(gè)列值的列表,還可以使用所包含的列值的拆分組合默色,來(lái)構(gòu)成不同的變化莫測(cè)的值列表(即值列表可以由一個(gè)或多個(gè)列值球凰、以及它們的組合變化構(gòu)成)。
? ? ? 因此腿宰,你可以將所謂的列表篩選呕诉,簡(jiǎn)單理解為列值的數(shù)量大小--列表范圍的變化。
? ? ? 當(dāng)然吃度,這包括最極端的兩種篩選結(jié)果(比較熟悉的兩種情況):一個(gè)是:結(jié)果為整列的列值的列表(列值沒(méi)有變化)甩挫,一個(gè)是:列表可能被篩選為只有一行的一列,也就是行列的交叉坐標(biāo)(單元格)椿每。
? ? ? ? DAX計(jì)算伊者,需要最后完成這種單元格式的、對(duì)應(yīng)于每一行的處理间护,才能填充數(shù)據(jù)作為輸出結(jié)果亦渗。被輸出的該單元格結(jié)果,一般都不需要過(guò)多關(guān)注)汁尺。我們關(guān)注的是DAX運(yùn)行過(guò)程中的所有值列表法精、列表行為。換句話說(shuō),我們不太需要關(guān)心數(shù)據(jù)模型里的物理元列表(它總是列表)亿虽,以及計(jì)算輸出的結(jié)果(你總會(huì)去檢查公式)菱涤。
? ? ? ? 4、綜合上述兩種情況洛勉,現(xiàn)在你可能已明白粘秆,之前我們有意使用了兩個(gè)不同的詞:引用(顯式)列表與定義(隱式)值列表。是的收毫,因?yàn)椴还苁鞘褂昧肆械哪承┨囟ㄐ兄械牧兄倒プ撸€是使用了完整的列本身(包含全部列值),這其實(shí)都是相同的語(yǔ)義此再。因而昔搂,很難區(qū)分到底是在使用哪一種。
? ? ? ? 很顯然输拇,DAX中摘符,你經(jīng)常需要面對(duì):現(xiàn)在使用的是列值還是列本身?這是需要明白清楚的一件事(很多資料上將它模糊化處理了)策吠。但后遺癥是明顯的逛裤,比如在回答某些公式行為時(shí),會(huì)顯得力不從心猴抹。
? ? ? ? 因此带族,我們將DAX操作列表的行為,稱為引用列表蟀给,將操作列值的行為稱為定義(偶爾會(huì)稱為:創(chuàng)建)值列表蝙砌。這對(duì)應(yīng)于列表的行、列兩種行為(行篩選與列表篩選)跋理。
? ? ? 當(dāng)你能夠識(shí)別出正在使用的是DAX的列引用(列表)择克,還是定義列的一個(gè)或多個(gè)列值(值列表)。有了這種思維前普,你將正式踏入DAX的新階段祠饺。
? ? ? ? 如果你需要更簡(jiǎn)單的描述。那么汁政,以一種語(yǔ)言式、文科生缀旁、方言式的方式是值得鼓勵(lì)的:DAX的整個(gè)篩選(某個(gè)計(jì)算單元或整個(gè)CALCULATE())记劈,一般是由整個(gè)列值(列表)-->一個(gè)或多個(gè)列值(值列表)-->單個(gè)行值(行、單元格)并巍。在還沒(méi)有討論DAX內(nèi)的一些更復(fù)雜的目木、特別的行為前。這已經(jīng)足夠正確。
? ? ? 當(dāng)我們使用“引用列表”時(shí)刽射,引擎能良好識(shí)別并自動(dòng)執(zhí)行它军拟。但是,當(dāng)從某個(gè)給定列表中檢索某些需要的列值時(shí)誓禁,你需要一種方法來(lái)告訴DAX:你使用的是哪些行懈息?以便用于DAX最后計(jì)算該值。換句話說(shuō)摹恰,您需要一種方法來(lái)定義表的當(dāng)前的列值(行的行為)辫继。
? ? ? 這就是我們通常所說(shuō)的“定義當(dāng)前行,或者稱為:“當(dāng)前行”的值列表(行)篩選姑宽。無(wú)論是顯式、還是隱式(計(jì)算列)中行的行為(所謂的遍歷)酣溃,都是在使用值列表篩選。
? ? ? ? 我們將在后續(xù)內(nèi)容中了解到定義"當(dāng)前行行為"的方式方法,以及常用的一些定義值列表的函數(shù)黔姜。
? ? ? ? 5纳寂、最初判定是列表還是值列表的最簡(jiǎn)單方式是:引用包含整個(gè)列的列值的一般為列表腋粥,否則,則是值列表。
? ? 現(xiàn)在,一個(gè)CALCULATE()計(jì)算中,我們用“引用”、“定義”來(lái)區(qū)分它。也就是說(shuō),你引用的是列表,定義的是值列表穷绵。
? ? ? ? 你可能已經(jīng)見(jiàn)過(guò)如下兩個(gè)公式目养,先看一個(gè)DAX表達(dá)式對(duì)列引用的操作表達(dá)式:
? ? ? ? 毛利額 := SUMX ( Sales礼旅,Sales[銷售額] – Sales[成本] )
? ? ? 上述表達(dá)式中:Sales[銷售額] 和 Sales[成本]是列引用。即:引用元列表(整個(gè)列的列值),然后由SUMX定義這兩個(gè)列的行行為(值列表的行篩選)总放,其中這兩個(gè)列的每個(gè)列值都是一個(gè)行篩選局雄,直到最后得出只有一行的值(一個(gè)值的值列表篩選甥啄。
? ? ? 再看一個(gè)DAX中使用定義的值列表來(lái)計(jì)算[產(chǎn)品名稱]列數(shù)量(計(jì)數(shù))的度量:
? ? ? 產(chǎn)品數(shù)量 : = COUNTROWS ( VALUES (產(chǎn)品[產(chǎn)品名稱] ) )
? ? ? 在該公式中,產(chǎn)品[產(chǎn)品名稱]列對(duì)于VALUES來(lái)說(shuō)衣形,是列引用--列表引用腻菇,VALUES要使用的是產(chǎn)品表中[產(chǎn)品名稱] 這個(gè)列(引用該列本身的全部列值,不是其他的列表)筹吐。換句話說(shuō)嘉竟,你引用列表--產(chǎn)品[產(chǎn)品名稱]列, VALUES函數(shù)針對(duì)該列表所有列值計(jì)算(結(jié)果是一個(gè)只包含唯一值的那些值列表)洋侨。
? ? ? 對(duì)于COUNTROWS函數(shù)來(lái)說(shuō)舍扰,你定義了一個(gè)值列表。因此希坚,COUNTROWS計(jì)數(shù)的列表是由定義的"VALUESi (產(chǎn)品[產(chǎn)品名稱]"部分的值列表边苹,它只包含了那些唯一值的列值,而不是所有的產(chǎn)品[產(chǎn)品名稱] 列的列值吏够。該部分值列表充當(dāng)列表被COUNTR0WS函數(shù)引用勾给。
? ? ? 該公式看起來(lái)比較簡(jiǎn)單,假如涉及到更多的列表引用以及值列表定義時(shí)锅知,則更復(fù)雜播急。
? ? 第15式:CALCULATE值列表與列表的存在方式
? ? ? 前面,我們說(shuō)過(guò)售睹,任何一個(gè)DAX計(jì)算式(或計(jì)算式單元)桩警,都需要一個(gè)顯式的列表篩選和一個(gè)隱式的行篩選(計(jì)算列中引用一個(gè)列表能計(jì)算,這可以看成:這時(shí)候隱式的行只有一個(gè)整列的列值昌妹,因而結(jié)果可能都是一個(gè)相同的值)捶枢。
? ? ? ? 因此,我們可以判斷飞崖,凡是DAX中的計(jì)算式參數(shù)烂叔,該計(jì)算式一定是一個(gè)即包含顯式列表,又包含隱式行行為的值列表固歪。
? ? ? ? 我們稍微舉兩個(gè)例子說(shuō)明蒜鸡,如圖(使用的是DAX Studio):
? ? ? 從DAX運(yùn)行過(guò)程中發(fā)現(xiàn),運(yùn)行被迫中止的位置牢裳,也正是這里逢防。
? ? ? 上述公式中,SUMMARIZE的新增計(jì)算列“01”蒲讯,依據(jù)的是后面的參數(shù):計(jì)算式的值(即函數(shù)的參數(shù)需要“定義”一個(gè)結(jié)果為值列表的計(jì)算式)忘朝。如果直接引用列(這里是訂單[銷售額]列),則由于缺少行的行為判帮,你會(huì)收到一個(gè)如上圖所示的錯(cuò)誤提示)局嘁。修正的方法很簡(jiǎn)單溉箕,現(xiàn)在,我們很容易就知道悦昵,你需要一個(gè)計(jì)算式的值列表约巷,比如添加像錯(cuò)誤提示里說(shuō)的:能獲取單一列值結(jié)果(隱式的行行為)的聚合類函數(shù) MIN、MAX旱捧、SUM、COUNT踩麦、AVERAGE(根據(jù)計(jì)算需要)定義的計(jì)算式枚赡。
? ? ? ? 在數(shù)據(jù)模型里,如果有類似的公式谓谦,也將收到一條相同內(nèi)容的提示贫橙。
? ? ? 當(dāng)然,你也可以使用前面本系列中已提到的FILTER反粥,SUMX卢肃,AVERAGEX,ADDCOLUMNS等所謂迭代器函數(shù)的任何一個(gè)DAX函數(shù)才顿,來(lái)定義一個(gè)計(jì)算式莫湘,其目的都是使行篩選可用(添加行篩選)。
? ? ? 如果行篩選不可用郑气,你試圖直接對(duì)列引用進(jìn)行計(jì)算則會(huì)產(chǎn)生錯(cuò)誤幅垮。例如,前面多次提到的:在DAX度量值中僅寫入列引用尾组,就會(huì)導(dǎo)致這種錯(cuò)誤忙芒,因?yàn)椴淮嬖谛泻Y選。
? ? ? ? 我們暫時(shí)先總結(jié)出如下所示的三種方式讳侨,你只要記住這幾種列表與值列表的“引用”與“定義”的方式與區(qū)別呵萨,以及在何種情形(這里是度量與計(jì)算列里的區(qū)別)下使用何種行為方式。內(nèi)部的機(jī)制暫時(shí)不管跨跨。
? ? ? ? 1)= Sales[銷售額]? -- 這是第一種:最常用的引用列表方式潮峦。它在計(jì)算列里可被引用,而在度量中不能直接引用歹叮。
? ? ? ? 2)為了使其能工作跑杭,你可以對(duì)該列進(jìn)行聚合運(yùn)算。因此咆耿,在度量中正確的定義應(yīng)該是:? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? = SUM ( Sales[銷售額] )? -- 這是第二種:最常用的值列表計(jì)算的定義方式德谅。這時(shí)候的列表已不是元列表,而是由SUM函數(shù)定義的值列表結(jié)果萨螺,我們稱它這時(shí)不再具備顯式列表性質(zhì)窄做。
? ? ? ? 3)由于公式計(jì)算需要愧驱,往往需要第 2)項(xiàng)里的值列表方式結(jié)果。也就是說(shuō)椭盏,我們即想讓它不失去值列表的行行為特征组砚,又要它像一個(gè)列表一樣能重新被“引用”。
? ? ? 這時(shí)候掏颊,唯一能做這件事的只有CALCULATE(CALCULATETABLE的參數(shù)是列表)糟红。這就是CALCULATE的顯式化引用列表的功能:CALCULATE能將值列表轉(zhuǎn)換為等值的列表--即值列表篩選轉(zhuǎn)換為等值的列表篩選,值列表計(jì)算轉(zhuǎn)換為等值的列表計(jì)算(否則你無(wú)法理解乌叶,一個(gè)包含了很多行的值列表為什么公式引擎只執(zhí)行一次也能得出正確的結(jié)果)盆偿。我們將第二個(gè)公式再次定義為:
? ? ? ? = CALCULATE(SUM ( Sales[銷售額] ) )? --即包含“引用”(顯式化)列表,又包含隱式行行為的值列表的計(jì)算式准浴。
? ? ? 公式中事扭, SUM ( Sales[銷售額] 的值列表結(jié)果(行的行為),總是被CALCULATE監(jiān)控乐横、捕獲--被顯式為列表求橄。這包括SUM ( Sales[銷售額] 中每產(chǎn)生一個(gè)行的行為的結(jié)果(比如每計(jì)算一次)時(shí),該結(jié)果都會(huì)被CALCULATE即時(shí)引用為列表葡公,并作為“列表”提供給其他計(jì)算罐农,以執(zhí)行“列引用”。這就是通常理解的所謂行迭代或遍歷(計(jì)算次數(shù))匾南,因?yàn)檫@中間可能還包括一次整列的列值計(jì)算啃匿。所以,有時(shí)候計(jì)算結(jié)果會(huì)包含一個(gè)我們并不需要的所謂匯總小計(jì)(該結(jié)果并不受現(xiàn)有篩選條件限制--例如透視表的篩選元素)蛆楞。如圖:顯式化列表處理后溯乒,公式正確運(yùn)行。
? ? ? 相對(duì)于上一個(gè)使用:SUM ( Sales[銷售額] ) 的雖然計(jì)算正確的公式(因?yàn)閺脑摴叫袨樯媳鄙俚闹皇且粋€(gè)值列表的行篩選裆悄,我們修正了它,從而獲得正確的計(jì)算臂聋。但是光稼,由SUMMARIZE定義的整個(gè)公式,要求該位置的參數(shù)應(yīng)該是一個(gè)真正的計(jì)算式孩等,因此艾君,最后所示的CALCULATE(SUM ( Sales[銷售額] ) ) 才是正解,它具備計(jì)算需要的顯式列表篩選與隱式的行篩選肄方。
? ? ? 如果你還記得的話冰垄,之前這樣子的例子我們已經(jīng)列舉了好幾個(gè)(比如求最近時(shí)期的當(dāng)前余額的公式,使用的LASTNONBLANK函數(shù)的參數(shù))……权她。它們有一個(gè)共同的特點(diǎn)虹茶,某一個(gè)參數(shù)需要的是:Expression(計(jì)算式)逝薪。
? ? ? 如果你想有一個(gè)能很快記住的、速成的一個(gè)結(jié)論蝴罪,那就是:類似上面的Expression參數(shù)董济,使用CALCULATE( )顯式化處理,總是一個(gè)不錯(cuò)的選擇要门。
? ? ? 6虏肾、其實(shí)不想拿透視表的篩選來(lái)分析,它與DAX查詢?cè)趦?nèi)部的行為并不相同(后續(xù)談到列表查詢時(shí)再說(shuō))欢搜。
? ? ? ? 通常询微,我們知道,在透視表的每個(gè)單元格都會(huì)有不同的一個(gè)或多個(gè)列表篩選狂巢,這是由用戶界面(如Excel中的數(shù)據(jù)透視表行、列以及切片器)隱式定義的书聚,這里也提到隱式唧领,這并不矛盾。因?yàn)椋?/b>應(yīng)用于數(shù)據(jù)透視表的任何用戶界面元素雌续,包括Power BI Desktop斩个、Powerpivot的列表篩選,都并不直接影響行(值列表)篩選(隱式行行為總是相同的驯杜、或者說(shuō)是被共享的)受啥。
? ? ? 也就是說(shuō),你每次改變的是計(jì)算列表所在的列表集的范圍(列值數(shù)量的減少)鸽心,而行篩選的行為不變滚局。所以,你完全可以使用CALCULATE通過(guò)某些DAX表達(dá)式進(jìn)行顯式定義顽频,其行為是一樣的藤肢。(區(qū)別稍后再論)。
? ? ? 而且糯景,任何列表篩選實(shí)際上是當(dāng)前所在數(shù)據(jù)模型上的一組等效的列表篩選器嘁圈。任何DAX表達(dá)式始終都在列表篩選的結(jié)果列表集中執(zhí)行。如果列表篩選為空白蟀淮,DAX表達(dá)式會(huì)在整個(gè)數(shù)據(jù)模型中運(yùn)行最住。當(dāng)列表篩選不為空時(shí),它限制DAX表達(dá)式在被篩選后的數(shù)據(jù)模型中運(yùn)行怠惶。
? ? ? 例如涨缚,我們?cè)跀?shù)據(jù)模型里的某個(gè)表里定義一個(gè)計(jì)算式,有時(shí)候會(huì)出現(xiàn)結(jié)果為空白的情況甚疟。這并不是公式錯(cuò)誤仗岖,而是它計(jì)算的是當(dāng)前數(shù)據(jù)模型表(還沒(méi)有拖拽到透視表篩選逃延,或還沒(méi)有定義任何篩選),而當(dāng)前數(shù)據(jù)模型里并不一定滿足公式中定義的條件(篩選)轧拄。
? ? ? 如圖揽祥,公式條件是:天數(shù)=366,它在數(shù)據(jù)模型的計(jì)算結(jié)果是空白檩电。因?yàn)楫?dāng)前計(jì)算的值列表針對(duì)的是整個(gè)列的列值(時(shí)期天數(shù)并不是366拄丰,而是整個(gè)表的列值--一個(gè)更大的數(shù))。要讓它計(jì)算出一個(gè)結(jié)果值俐末,你需要篩選出那些一年中為366天的年份料按,你可以在當(dāng)前數(shù)據(jù)模型里的年份列里篩選出符合條件的年份,或者在透視表里做同樣的篩選卓箫。
? ? ? 甚至载矿,偶爾還會(huì)出現(xiàn)那些在數(shù)據(jù)模型里顯示為錯(cuò)誤的計(jì)算式,也并不一定是一個(gè)錯(cuò)誤的公式的情況烹卒。原因也是:數(shù)據(jù)模型并不總是符合它的條件(這只會(huì)出現(xiàn)在定義的公式內(nèi)部篩選中)闷盔。
? ? ? ? 進(jìn)一步的理解,你需要使用值列表或列表篩選的特點(diǎn)旅急。根據(jù)值列表與列表的特點(diǎn):它們都是列表逢勾,本質(zhì)上并沒(méi)有區(qū)別,只是用它們代表列表的兩種方式行為藐吮。我們說(shuō)溺拱,一般地,把含整個(gè)列值的稱為列表谣辞,否則迫摔,稱為值列表。
? ? ? ? 那么泥从,從行列值的角度看攒菠,一個(gè)包含整個(gè)列值的值列表也就是通常的列表,只有一個(gè)或多個(gè)結(jié)果的(一個(gè)或多個(gè)列值)的列表是值列表......歉闰。? ?
? ? ? ? 前面的公式:COUNTROWS ( VALUES (產(chǎn)品[產(chǎn)品名稱] ) )中辖众,元列表是產(chǎn)品[產(chǎn)品名稱] 列,對(duì)于VALUES來(lái)說(shuō)和敬,我們是“引用”該列凹炸,而對(duì)于COUNTROWS來(lái)說(shuō),我們是“定義”該列(使用了VALUES函數(shù))昼弟,引用的是該列的值列表(VALUES函數(shù)計(jì)算后的唯一值的結(jié)果:這時(shí)候它不再擁有該列的全部列值的數(shù)量啤它,但該結(jié)果的數(shù)量--甚至有沒(méi)有值,都已不是重點(diǎn),重點(diǎn)是变骡,它已經(jīng)作為列表提供給COUNTROWS引用--或者說(shuō)是COUNTROWS的“引用列表”)离赫。
? ? ? 所以,作為強(qiáng)調(diào):值列表與列表是可以不斷進(jìn)行角色變化的(比如行篩選與列表篩選轉(zhuǎn)換)塌碌,最后渊胸,就是一個(gè)值的“單元格”式的結(jié)果。
? ? ? ? 為什么會(huì)感覺(jué)如此的拗口台妆?有什么辦法翎猛?還得繼續(xù)。
? ? ? ? 所以接剩,最好不要完全依賴于數(shù)據(jù)模型表里的度量公式的結(jié)果切厘,來(lái)檢驗(yàn)公式是否正確。由于數(shù)據(jù)模型表里的計(jì)算針對(duì)整個(gè)列表懊缺,那么疫稿,凡是值列表的條件(比如定義的布爾值列表)計(jì)算,有可能為:空白或不顯示鹃两。
? ? ? 如圖而克,我們定義兩個(gè)度量,一個(gè)是元度量[銷售]怔毛,一個(gè)是基于該元度量定義的布爾值(值列表)篩選下的度量。
? ? ? (這也是目前為止腾降,我們定義的第一個(gè)除元度量之外的稍復(fù)雜點(diǎn)的函數(shù))拣度。
? ? ? 它們?cè)谙嗤臄?shù)據(jù)模型表里的結(jié)果,以及給出篩選后的計(jì)算結(jié)果分別如下圖所示:
? ? ? ? 如果將[客戶lD]列篩選為空值螃壤,則[銷售]度量結(jié)果為:空白抗果,[計(jì)數(shù)_銷售]度量結(jié)果仍然是2290不變(附圖待補(bǔ),不小心刪掉了)奸晴。
? ? ? 直接在該數(shù)據(jù)模型里篩選冤馏,也可以在透視表里篩選,效果是一樣的:其實(shí)際都是列表篩選寄啼。上述三個(gè)篩選下得出了不同的結(jié)果逮光,最好的解釋是:兩個(gè)公式是在不同的數(shù)據(jù)列表集里運(yùn)行,相互間是獨(dú)立的計(jì)算墩划。
? ? ? 因此涕刚,你可以認(rèn)為:每個(gè)DAX公式,都是在各自引用的列表乙帮、以及定義的值列表所創(chuàng)建的列表集(關(guān)系列表集)中工作杜漠。
? ? ? 官方將DAX表達(dá)式應(yīng)用的任何篩選器都統(tǒng)稱為查詢列表。實(shí)際上,這些篩選器的效果幾乎是相同的(不需要研究這種差異)驾茴,因此盼樟,我們簡(jiǎn)單地將列表篩選定義為限制DAX表達(dá)式計(jì)算(通常是度量值)的一組篩選器,而不管它們是如何生成的锈至。
? ? ? 例如晨缴,透視表里的所有篩選因素的篩選,將造成相同度量值出現(xiàn)不同結(jié)果裹赴。這與通過(guò)使用CALCULATE顯式列表篩選具有相同的計(jì)算效果喜庞。
? ? ? 我們前面說(shuō)CaⅠculate的最簡(jiǎn)單理解為:定義一個(gè)結(jié)果為值列表的關(guān)系列表集。問(wèn)題是棋返,我們?nèi)绾螌⑦@些知識(shí)對(duì)應(yīng)于DAX的兩個(gè)列表狀態(tài)延都,以構(gòu)建DAX公式?
? ? ? ? 關(guān)于DAX列表的理解睛竣,到這里己基本完成晰房,接下來(lái)將是研究如何使用它們構(gòu)建公式。重點(diǎn)是完成兩個(gè)關(guān)鍵:篩選與計(jì)算射沟。
未完待續(xù)殊者。