CALCULATE 庖丁解牛系列- CALCULATE專解(1)

CALCULATE之庖丁解牛系列 -- CALCULATE專解(1)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ---- 學習DAX的門票

公眾號:零售數(shù)據(jù)BI-laoliu? QQ: 2889374742

? ? 前言:

? ? ? 特別申明:本系列文檔為方便自己學習而整理(因為非官方,參考了一些網(wǎng)絡上官方發(fā)布的文檔知識內(nèi)容及簡體筆記。在此一一致謝)。
? ? ? Power非官方DAX雖然分為多個系列,但實際是即關聯(lián)又獨立。大部分內(nèi)容并不是按順序進行。這不是DAX的啟蒙文,但盡量從基礎部分開始。
? ? ? ? 這個CALCULATE系列其實醞釀了好幾次。因為是DAX最基礎的、最全面的部分,總覺得整理起來很難。也由于自己在該領域的非專業(yè)性、非科班性的局限……。
? ? ? ? 當然,既然已經(jīng)開始,那便開始!CALCULATE系列可能會持續(xù)很久(初步設計為108式(對應CALCUALTE的知識點,可能會在不同的合適位置提出來,但是可能會在其他業(yè)務場景中詳細說明)。取108式,可能是因為這容易讓人關聯(lián)性想起梁山108條好漢。其他的系列都是這個系列的輔助并與之相關)……。

? ? ? ? 注:所有Power非官方系列內(nèi)容,屬于“Power BI非官方”獨家發(fā)布,引用及轉(zhuǎn)載請注明出處或聯(lián)系本人。
? ? ?
這是一個浮躁的年代。我本來也想使用快餐式的一句話、一個圖、一個GIF的啟蒙類寫法。然而,經(jīng)過仔細的、漫長的、艱苦的思考斟酌,還是不要為難自己為好……。讓我們開始:?

? ? 第1式:CALCULATE的隱式與顯式

? ? ? ? CALCULATE是DAX語言中最基本、最重要、最實用、最復雜、最難懂、最能代表DAX計算的函數(shù)。一句話,毫不夸張的說,CALCULATE代表了DAX的全部。? ? ?
? ? ? ? 類似的一個函數(shù)是CALCULATETABLE(它與CALCULATE的特性、行為幾乎相同,不同的是,CALCULATETABLE函數(shù):計算并返回一個或多個列表而不是標量值),為了簡單,僅以CALCULATE來分析。

? ? ? 本系列需要具備一定的DAX知識。因為CALCULATE的重要性涵蓋了DAX的所有概念,所以,知識點可能比較跳躍(比如直接引用某個DAX案例公式或者某個概念)。但我們盡量從最基礎的部分開始。
? ? ? 實際上,CALCULATE函數(shù)本身很簡單,簡單到可理解為一句話:定義一個DAX計算。

? ? ? 然而,實際上我們需要更全面的理解它,理解CALCULATE可能涉及的多個重要概念、規(guī)則、行為等。例如,它回答:CALCULATE在DAX是什么以及如何運用的諸多問題,我們略舉一些:

1、任何DAX都需要一個CALCULATE(隱式或顯式);
2、CALCULATE的計算執(zhí)行順序;
3、CALCULATE的行(列值)、列表篩選;
4、CALCULATE的第一個參數(shù)特點;
5、CALCULATE的其他參數(shù)(第一個參數(shù)以外)特點;
6、CALCULATE或CALCULATETABLE調(diào)整計算篩選;
7、CALCULATE 中ALL系列函數(shù)的行為;
8、CALCULATE中VALUES的作用;
9、CALCULATE的篩選轉(zhuǎn)換作用;
10、CALCULATE的列表關系的自動傳遞作用;?
11、CALCULATE的篩選與擴展表概念。
……
? ? ? 等一等,再列舉下去(我們說有差不多108式?。?,估計要暈。在繼續(xù)之前,我們先要聊兩個似乎與本系列主題無關,但又不得不闡明的觀點。
? ? ? ? 第一個觀點,是學習DAX過程中需要記住的:很多時候,我們可以某種方式或某個自己能把握的概念來達到理解DAX的目的(官方也推出過很多通俗易懂的概念,本人也想搞個關于DAX的三部曲,哈哈)……。但DAX最終的內(nèi)部核心卻一直是一個專業(yè)的領域。
? ? ? ? 也就是說,你可以用這樣或那樣的方式、方法(思維)去理解DAX,但它內(nèi)部不一定是這樣!很多人學DAX,悟到一點東西,就上鋼上線,大喜過望,以為掌握了,可是、可是、可是……。真的是這樣嘛?只能很遺憾的告知你:不一定!
? ? ? ? 所以,列表+關系、擴展表、列值、列表以及值列表、列表篩選等等,這些概念都是出于正確理解和使用DAX的需要……。用一句有點拗口的話來說:學習了DAX的這些概念,你不一定就“很DAX”,但“很DAX”的一定是先要理解了這些概念(使用DAX時不必要再糾結(jié)這些概念,所謂的“置于死地而后生”)。

? ? ? 第二個觀點?;诘谝粋€觀點,讓我想起《天龍八部》的一句話:每當研習一門絕世武功之前,必須有相應的一種心法來容納它,否則容易走火入魔……。
? ? ? DAX學習,目前似乎都有些亂: 先是“上下文”搞暈一大堆人;再是用反反復復的DAX把式,忽悠一大堆人;然后把人帶入 “學會幾句DAX口語”就能行走天下的誤區(qū),耽誤一大堆人;用超炫的幾個DAX場景圖表羨慕死一大批人……。一句話:易得DAX浮躁病。

? ? ? 其實,所謂萬變不離其中。首先,DAX是一門函數(shù)語言工具。必須先學習這門語言的基本字母、發(fā)音規(guī)律,之后才能掌握它。哪怕一開始慢一些,困難一些。你想想,你在那些”學幾句口語就走天下”的影響下,效仿炫酷得有些妖艷的場景引誘下所花的時間還少嗎?
? ? ? 準官方SQLBI提到的2018版DAX學習之路,很多人拿來就用,發(fā)現(xiàn)水土不服……。陷入莫名的DAX知識旋渦里出來不了。學習完一個知識點、搞定一個公式、解決一個業(yè)務場景……。之后呢?總會遇到一個又一個問題以及又回到瓶頸之處……。

? ? 有沒有想過,所有這些,問題出在哪里?

? ? ? 也有人總問起一些接近這個問題的問題,一直都沒辦法回復,怕自己水平有限,說不清楚,如是總是說:這需要一個系列來回答。其實,想想《天龍八部》里的一句話就明白了:無論使用何種方式學習某個絕世武功(DAX也應該算),必須先要修煉出一個強大的內(nèi)功心法來容納它,否則注定會走火入魔!前面,我們將理解CALCULATE需要的知識點羅列了11項(當然不止這些,我們計劃著108式)?;贑ALCUALTE的了解,就是DAX的心法。

? ? 第2式:CALCULATE的元度量

當你開始學習DAX時,第一個真正的DAX公式不是:
[元度量_隱式]:= SUM(Sales[sale])
而應該是包含? CALCULATE的DAX公式:
[元度量_顯式]:= CALCULATE(SUM(Sales[sale]))

? ? ? ? 也就是說:只有使用了CALCULATE才算是:定義了一個DAX計算。因為,任何DAX都需要一個CALCULATE(隱式或顯式)。因此,第二個公式似乎更像DAX一些,前者不過是省略(隱式)了CALCULATE()而已。
? ? ? 我們把這種不帶任何篩選條件、CALCULATE只有第一參數(shù)的度量稱為元度量。
? ? ?
“任何DAX都需要一個CALCULATE(隱式或顯式)”,這是前面羅列的理解CALCULATE的第一個問題,這也許是你一開始學習DAX,就需要面對的第一個DAX問題。這需要我們厘清兩個公式不同的行為(有點繞口的部分):?
? ? (1)兩個公式對應于CALCULATE的隱式與顯式,即前者公式隱式了CALCUALTE(),后者公式顯式使用CALCULATE()。
? ? (2)很顯然,接下來的問題就是:為什么有隱式或顯式的CALCULATE的區(qū)別?即關于CALCULATE的第一個概念:隱式與顯式。
? ? ? 所謂隱式,就是內(nèi)部引擎能自動完成,不需要定義的行為;
? ? ? 所謂顯式,就是必須由計算式(比如引用列表或函數(shù)定義,包括CALCULATE本身)定義的行為。
? ? ? 也就是說,兩個元度量公式能使用的前提,應該是:

? ? ? ? (1)定義計算式;(2)加上引擎能自動完成。即在兩個前提(顯式或隱式條件)下使用。例如,我們先在數(shù)據(jù)模型計算區(qū)域里定義一個元度量:

? ? ? 銷售:=SUM('訂單'[銷售額])

? ? ? 這時候,并沒有使用CALCULATE顯式定義它,但公式也能計算出正確的結(jié)果值(這里是針對度量所在表的計算),唯一的解釋(或條件)就是DAX內(nèi)部引擎能自動判斷并執(zhí)行了該計算。如圖:

? ? ? 第3式:CALCULATE需要行、列表篩選共存

? ? (3)如果你已經(jīng)知道DAX的行、列篩選:任何一個DAX公式都需要同時具備行篩選和列表篩選(無論隱式還是顯式)。
? ? ? 注:應該說,是每個DAX計算單元都需要行、列篩選(無論隱式還是顯式),一個較長的DAX公式里可能包含一個或多個計算單元。

? ? ? 所以,這里對應的就是隱式行篩選與顯式列篩選的定義及不同的行為區(qū)別。

? ? ? ? 注意:官方稱這兩種篩選為行上下文和篩選上下文。未做特別說明,所有本人的DAX系列文章全部采用行篩選與列表篩選的稱呼。

? ? ? ? 接下來的問題是:什么情況下是隱式還是顯式的篩選?

? ? ? 上圖中,銷售:=SUM('訂單'[銷售額]),這個被放置在模型表的度量能計算出正確的結(jié)果。那么,它就必須同時存在行、列表篩選。該公式告訴DAX,它針對數(shù)據(jù)模型里訂單表的[銷售額]這個列計算(對該列執(zhí)SUM()求和)。? ?
? ? ? ? 很顯然,DAX并不知道我們要計算的列表是哪一個、以及是針對該列的整列還是部分,這里的[銷售額]列是需要我們定義的計算列表(方式為SUM函數(shù)求和功能),因為DAX可以被認為是一種函數(shù)語言,因此,通俗點說:

? ? 你首先需要告訴DAX,計算的列表是什么?

? ? ? 上圖中,銷售:=SUM('訂單'[銷售額]):通過我們的定義,使它具有了顯式的列表篩選(先不討論列表關系傳遞、以及擴展表概念等概念疊加,后面部分會討論這些)。
? ? ? 一旦定義了計算列表,而另一個看不見卻又存在的行篩選,即由引擎內(nèi)部自動完成而無需再定義的隱式行篩選。這就是為什么明明只定義了一個顯式列表('訂單'[銷售額]列),并沒有指示它應該按何種行方式計算,DAX卻能計算出正確的值的原因(后面將進一步介紹這種“行的行為”)。

? ? ? 既然是自行完成,也就是說,不需要管行篩選是如何進行的,你只要指定一個顯式列表給DAX,它就能正確計算!
? ? ? 例如,我們通常將該度量值放置在透視表里,因為這時它天然自帶行篩選,你只需要定義它為顯式列表即可。然后你改變透視表的行、列、切片器等,這其實是一組顯式列表篩選集,它們共同定義出計算列表(比如計算列表的范圍)。
? ? ? 這也就是我們通常所說的:當所有這些篩選器放入一個邏輯條件里(透視表或DAX定義)共同作用于顯式列表)時,則形成當前列表篩選—DAX計算所在計算列表環(huán)境(本概念后面章節(jié)中會更新它)。它改變:銷售:=SUM('tb訂單'[銷售額]) 定義的顯式列表篩選,隨之,與其對應的隱式行篩選將不用定義、并由引擎自行完成行篩選。

? ? ? ? 注意:透視表的這種查詢篩選其實并不是真正的DAX查詢,而是MDX。這里從略,后面將有介紹。

? ? ? 第4式:CALCULATE定義顯式列表

? ? ? ? 而且,由于DAX內(nèi)部引擎是一個列式數(shù)據(jù)庫,引擎始終認為列表是可見的、存在的。換句話說,它始終執(zhí)行顯式列表。
? ? ? ? 因此,很多時候為了讓DAX能正確計算,需要將某些行行為作列表顯式化處理,以便內(nèi)部引擎能識別出來。而唯一有這種能力的只有CALCULATE與CALCULATETABLE函數(shù)。這一點是前面提到的第9點。所以,我們有了關于第一個元度量的注釋:

? ? ? ? 銷售:=SUM('訂單'[銷售額]) –-包含顯式列表篩選與隱式行篩選。

? ? ? 推而廣之,任何一個隱式(不帶)CALCULATE的元度量(比如由SUM、COUNT、MIN等函數(shù)直接定義的某個列表的計算),都包含一個顯式的列表篩選以及一個隱式的行篩選。也就是說,任何元度量(未加任何篩選條件的)都具有隱式的行篩選。

? ? ? 還是看看這些行為的運用場景:

? ? (1)前面的公式:銷售:=SUM('訂單'[銷售額]) 。它針對數(shù)據(jù)模型計算(即針對整個表:這里是對應的[銷售額]整列),因此,結(jié)果為整列的聚合值:=1758423,如圖:

? ? (2)因為引擎自動執(zhí)行行篩選,所以,只要改變顯式列表(比如不是整列—列表的部分或其他篩選定義)。剛才的公式計算針對的是整個數(shù)據(jù)模型表的計算,現(xiàn)在,我們在數(shù)據(jù)模型里改變它,比如針對時期列篩選出一段時期(這同時會篩選到[銷售額]列),結(jié)果將隨著改變:=62686(不是1758423)。

? ? ? 同一個公式,計算結(jié)果發(fā)生改變的原因只能是:顯式列表的改變(列表范圍的改變),因為這時候的行的行為是相同的(隱式行篩選行為是相同的—逐行掃描,即遍歷,這也是暫時的理解)。

? ? (3)再看看針對計算列的CALCULATE隱式與顯式:

? ? ? 我們新建一個[銷售列]的列。定義相同的公式:= SUM('訂單'[銷售額]) ,即針對[銷售額]計算。

? ? ? 結(jié)果并不是我們期待的,而是一個每行結(jié)果相同的值。這其中一定是與前面的度量行為發(fā)生了不一樣的變化。這里要分清:行、列篩選中,哪個是定義的,哪個是不需要定義的,或者再啰嗦點說,這有幾種可能:
? ? ? 1)不需要定義的、引擎能自動執(zhí)行的隱式行篩選,被顯式定義了;
? ? ? 2)需要定義的顯式列表篩選,被隱式了;
? ? ? 3)或者隱式、顯式的行為完全都被顛倒了(該隱式的顯式了,該顯式的隱式了);
? ? ? 4)要不缺少列表篩選,要不缺少行篩選,或者兩者都沒有(很少見)。
? ? 在今后的DAX公式運用中,經(jīng)常會出現(xiàn)這幾種情況,這里暫時略過。

? ? ? 要說清這個問題有點超前(涉及行列篩選概念),先做個預熱了解。下一個部分會詳說。

? ? ? 本例中,涉及到計算列。因為任何計算列都具有物理列表屬性(其實際就是一個物理表,需要占有內(nèi)存來存儲),請記住,在數(shù)據(jù)模型里,任何一個列本身并不具有單個行值(數(shù)據(jù)列表不具有行的概念,所以,你可以理解為:DAX里所有關于行的行為都是隱式的)。
? ? ? 當然,列表的每一行都可以有一個不同的值。因此,如果想要定義單個列值,則需要定義出要使用的行。而指定要使用的行的唯一方法就是行篩選(下一部分將介紹的值列表篩選)。
? ? ? 我們其實已經(jīng)知道結(jié)果,對于計算為同一個值的這種行為,有DAX基礎的應該都知道,這大都是因為缺少行篩選的原因!本例中計算列的計算,并沒有行篩選,因而公式是錯誤的,DAX拒絕計算。

? ? ? 問題是,我們不是定義了:= SUM('訂單'[銷售額]),告訴DAX要聚合計算'[銷售額]列的值嗎?,而且,我們前面剛剛說過:計算中使用的SUM和MAX等聚合函數(shù)定義的公式:具有顯式的列表篩選,以及隱式的行篩選(即忽略行篩選)。
? ? ? 雖然我們用一句話:“計算列里缺少行篩選”就解釋清楚了,但研究這種行為很有用。后面還會繼續(xù)。

? ? ? 也就是說,我們真的是使用了迭代器以編程方式創(chuàng)建了行篩選,與前面的度量行為相同,這里的計算列都使用了同一DAX表達式,那么,區(qū)別應該在于計算的內(nèi)容!前面已提問:
? ? ? 你首先需要告訴DAX計算的列表是什么?
? ? ? ?
問題是,僅僅告訴DAX計算的列表是什么還不夠,還需要DAX引擎能夠聽得懂你的語言,并執(zhí)行你的定義。所以我們還得加上一句提問:
? ? ? ? 其次, DAX能識別和執(zhí)行你定義的列表計算嗎?

? ? ? 我們已經(jīng)明白,度量是在透視表或DAX查詢的當前行、列(都是列表篩選)子集中計算的,而計算列是在它所屬的表的行級別上計算的。
? ? ? 所以,當你使用SUM('訂單'[銷售額]) 時,你定義的是所有這些條件下行的總和。本例中的DAX計算列,只有列表篩選,因此只能使用列表篩選來確定列值(整列的列值):

? ? ? 一方面,雖然計算列不存在行篩選,但還是可以通過行的行為來了解該問題。? ?
? ? ? 我們假設它存在行篩選,則它為第一行創(chuàng)建一個行篩選,然后調(diào)用公式計算,一直到遍歷整個表的所有行。公式計算了當前篩選中的所有銷售額的總和。所以,現(xiàn)在真正的問題是:當前的篩選是什么?? ? ? ? 你當然可能會回答:計算所在的數(shù)據(jù)模型表呀。但是,因為這里并沒有當前的活動篩選存在,DAX引擎會將該計算列作為定義的一部分(即針對定義的顯式列表:[銷售額]列)計算。

? ? ? 另一方面,即使有行篩選,SUM也會忽略它。它能使用的只有列表篩選(同一個不變的顯式列表篩選),而當前篩選現(xiàn)在是完整的數(shù)據(jù)模型表(計算列所在的表,這意味著每次行篩選對應的都將是同一個顯式列表)。因此,你會得到一個相同的銷售總額(所有行的總值)。結(jié)果如前面的圖所示。

你可以理解為,這時的行篩選與列表篩選是同一個篩選(都對應于整刻)。

? ? ? 現(xiàn)在,我們換一種方式理解。根據(jù)隱式、顯式篩選的定義來理解:定義一個計算列,對于DAX引擎來說該計算列屬于顯式列表。而事實上,計算列是不需要定義的,DAX引擎自然知道你針對的總是該列(沒有度量方式的顯式列表變化)并能執(zhí)行計算。
? ? ? 也就是說,主觀上,我們似乎想給DAX定義顯式的列表篩選(事實也確實如此:這是你寫SUM('訂單'[銷售額]) 這個計算列的初衷),但客觀上,相對于DAX引擎來說,這時候其實是隱式的列表篩選(無須顯式定義)。
? ? ? 使用SUM(),則是為了添加計算需要的隱式行篩選,以便運用DAX引擎的隱式行篩選,計算出每一行的正確值。
? ? ? 可是,這時候無論這個隱式的行篩選是否存在,實際上,它面對的都是一個隱式的列表篩選,似乎行、列篩選都是隱式的行為(這種引擎的行為,相當于完全需要引擎自動執(zhí)行計算而變得毫無意義,這種行為與我們后面要說的ALL的絕對值結(jié)果行為還不一樣),這就給我們一個提示或者說是結(jié)論:

? ? ? ? 通常,DAX計算(含計算單元)需要的都是一個顯式的列表篩選以及一個隱式的行篩選。

? ? 第5式:CALCULATE顯式列表總伴隨隱式行篩選

? ? (4)通過前面的介紹,我們來看看正確的計算列公式與度量公式的幾種行為方式以及區(qū)別(關于計算列與度量的詳細區(qū)別容后再續(xù)):

? ? ? 1)我們可以直接定義一個顯式列表的計算列,這種行為相當于顯式列表后,伴隨而來的是該列表篩選同等效果的隱式行篩選。更好的、可能有些拗口的理解是:你可以認為這是:一個顯式列表伴隨對應的一個隱式行篩選。
? ? ? 是的,你沒有看錯,無論列表還是行篩選都只有一個!雖然我們還沒有具體了解DAX引擎內(nèi)部是如何運行的,但肯定不是前面討論的行行為:一行一行的遍歷!如果這樣,那DAX的效率實在是太低了!也沒有任何優(yōu)勢與存在的必要了。
? ? ? 這時候,你只要知道遍歷只發(fā)生一次就行。或者記?。河嬎懔欣镏灰@式定義列表后,就不必考慮隱式行篩選(前面的研究只是為了更好的理解),這是DAX中難于理解的一個行為。如圖,直接定義 =[銷售額],結(jié)果相當于復制了某個列表。

? ? ? ? 2)接著,只要是針對某個表格的計算列操作,該表格里所有的列表都可以被定義為顯式列表參與計算。比如,我們可以直接定義兩個或多個標量值列表之間的計算。如下圖的兩個時期列表的差異計算(相減)。

? ? ? 3)如前所說,上圖中的公式運用在度量中,則會得到一個“錯誤號”提示。原因當然是已經(jīng)提示的那樣:缺少隱式的行篩選。

? ? ? 4)既然是缺少隱式的行篩選,我們使用聚合函數(shù)的行行為特性,分別對兩個列加上聚合計算(所有迭代函數(shù)都具有隱式行篩選行為,這將針對兩列都創(chuàng)建了各自的行篩選)。如圖:結(jié)果正確。

? ? ? 5)在公式 = SUM('訂單'[銷售額]), 前面加上CALCULATE(顯式定義列表篩選):
= CALCULATE ( SUM('訂單'[銷售額])),這時候,只要顯式定義了列表篩選,那么,引擎會自動創(chuàng)建該顯式列表篩選對應的隱式行篩選(這是CALCULATE的行為之一,前面已羅列,后面會論述)。如圖所示,計算列的公式能計算出正確的值。

因此,也就有了CALCUALTE的第6式:

? ? 第6式:CALCULATE將隱式行篩選顯式為列表

? ? ? CALCULATE第6式,就是前面提到的CALCULATE的一個很重要的行為:它將隱式行篩選轉(zhuǎn)變?yōu)椋ǘx為)與之等效的顯式列表篩選。這一點與前面的第5式是相通的,將隱式行篩選轉(zhuǎn)變?yōu)椋ǘx為)與之等效的顯式列表篩選后,并不是行篩選消失了或不需要了,而是可能同時具備了隱式的行篩選或與其他行篩選組合成新的當前計算篩選,這也是使用CALCUALTE這樣做的目的。
? ? (5)今后在學習DAX的過程中,將不可避免的接觸到顯式與隱式以及對應的篩選問題。而且由于所在的計算列表集的不同、以及所定義的邏輯條件不同而更加復雜。

? ? ? 我們提前舉例一個顯式列表篩選的情況:我們知道,LASTNONBLANK函數(shù)是一個迭代函數(shù)(遍歷所有行值),所以,與所有迭代器一樣, 它有一個行篩選, 但可能沒有列表篩選。

因此,以下公式將計算錯誤:

最近余額: =
CALCULATE (SUM ( 數(shù)據(jù)表[銷售額] ) ,
LASTNONBLANK ( 日歷表[時期] ,
SUM ( 數(shù)據(jù)表[銷售額] ) ) )? -- 隱式行篩選,沒有顯式列表篩選。

正確的公式,應該使用顯式的CALCULATE():

最近余額: =
CALCULATE (SUM ( 數(shù)據(jù)表[余額] ),
LASTNONBLANK ( 日歷表[時期],
CALCULATE ( SUM ( 數(shù)據(jù)表[余額] ) ) )) --隱式行篩選,被轉(zhuǎn)換為顯式列表

? ? 用圖標示出隱式與顯式的關系:

或者標示為如下圖:

? ? ? 到現(xiàn)在為止,我們都在圍繞著一個主題在討論,那就是DAX兩種形態(tài)的元度量,并由此展開的有關CALCULATE的行為方式。這些行為方式的理解,是今后熟悉更復雜、邏輯條件更多的DAX的基礎。我們把這兩個元度量再次羅列出來:

[元度量_隱式]:= SUM(Sales[sale])
[元度量_顯式]:= CALCULATE(SUM(Sales[sale]))

? ? ? 通過前面的啰嗦,第二個度量公式:CALCULATE(SUM(Sales[sale])你應該不會像一開始那樣覺得它很奇怪,至少稍微理解了一點。當然,我們接下來要講到CALCULATE的參數(shù)語法、規(guī)則、行為方式等。

未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容