到本書(shū)的這一章時(shí)养葵,您已經(jīng)學(xué)習(xí)了DAX語(yǔ)言的基礎(chǔ)知識(shí)蜒什。您知道如何創(chuàng)建計(jì)算列和度量值拇泛,并且您已經(jīng)很好地理解了DAX中的通用函數(shù)荣倾。在這一章中悯搔,你將進(jìn)入該語(yǔ)言的下一階段:在學(xué)習(xí)了DAX語(yǔ)言堅(jiān)實(shí)的理論背景之后,你將能夠成為一個(gè)真正的DAX選手舌仍。
到目前為止妒貌,您已經(jīng)獲得了一些知識(shí),您可以創(chuàng)建許多有趣的報(bào)告铸豁,為了能創(chuàng)建更復(fù)雜的報(bào)告灌曙,你還需要學(xué)習(xí)計(jì)算上下文。計(jì)算上下文是DAX所有高級(jí)特性的基礎(chǔ)节芥。
我們想對(duì)我們的讀者說(shuō)幾句話(huà):計(jì)算上下文的概念很簡(jiǎn)單在刺,你很快就會(huì)學(xué)習(xí)和理解它。然而头镊,您需要徹底地理解一些底層的細(xì)枝末節(jié)蚣驼;否則,在你的DAX學(xué)習(xí)路徑中相艇,你會(huì)感到迷失颖杏。我們?cè)诠埠退饺苏n程中教許多用戶(hù)。我們知道這是絕對(duì)正常的坛芽。在某一時(shí)刻留储,你會(huì)覺(jué)得公式像魔術(shù)一樣工作,因?yàn)樗鼈兪怯行У牧悴幻靼诪槭裁椿窕洹e擔(dān)心:許多人也有同樣的問(wèn)題。大多數(shù)DAX的學(xué)生在學(xué)習(xí)時(shí)能理解活喊,而其他許多學(xué)生將來(lái)也會(huì)理解赔嚎。這僅僅意味著計(jì)算上下文對(duì)他們來(lái)說(shuō)不夠清晰。在這一點(diǎn)上胧弛,解決方案很簡(jiǎn)單:回到這一章,再讀一遍侠畔,你可能會(huì)發(fā)現(xiàn)一些新的東西结缚,這是你在第一次讀到的時(shí)候漏掉了。
此外软棺,計(jì)算上下文在CALCULATE函數(shù)的使用中起著重要的作用红竭。CALCULATE可能是DAX中最強(qiáng)大、最難以學(xué)習(xí)的函數(shù),我們將在第5章“理解 CALCULATE和CALCULATETABLE”中介紹CALCULATE茵宪,然后在書(shū)的其余部分中使用它最冰。在沒(méi)有堅(jiān)實(shí)的計(jì)算上下文背景的情況下,理解CALCULATE是有問(wèn)題的稀火。另一方面暖哨,在不嘗試使用CALCULATE的情況下,理解計(jì)算上下文的重要性幾乎是不可能的凰狞。因此篇裁,這一章和隨后的一章根據(jù)我們之前的經(jīng)驗(yàn),總是會(huì)被標(biāo)記并反復(fù)查閱赡若。
介紹計(jì)算上下文
讓我們先了解一下計(jì)算上下文是什么达布。任何DAX表達(dá)式都是在上下文中求值的。上下文是計(jì)算公式的“環(huán)境”逾冬。例如黍聂,考慮一個(gè)非常簡(jiǎn)單的公式:
[Sales Amount] := SUMX ( Sales, Sales[Quantity] * Sales[UnitPrice] )
您已經(jīng)知道這個(gè)公式計(jì)算的是什么:數(shù)量乘以?xún)r(jià)格的總和。您可以將這個(gè)度量值放在一個(gè)透視表中身腻,并查看結(jié)果产还,如圖4-1所示。
這個(gè)數(shù)字本身看起來(lái)一點(diǎn)都不有趣雕沉,是嗎?但是去件,如果你仔細(xì)想想坡椒,這個(gè)公式計(jì)算出它應(yīng)該計(jì)算的東西:所有銷(xiāo)售金額的總和,這是一個(gè)沒(méi)有多少含義的大數(shù)字。當(dāng)我們使用一些列來(lái)分開(kāi)查看這個(gè)結(jié)果時(shí)诉濒,這個(gè)透視表變得就有趣了兼贡。例如,您可以使用產(chǎn)品顏色丈攒,將其放在透視表行中,這時(shí)透視表突然就顯示了一些有趣的業(yè)務(wù)見(jiàn)解授霸,如圖4-2所示
總數(shù)仍然在那里,但現(xiàn)在它是小數(shù)字的總和碘耳,每個(gè)值显设,連同所有其他的值,都有意義辛辨。但是捕捂,如果你再仔細(xì)想想瑟枫,你應(yīng)該注意到這里發(fā)生了一些奇怪的事情:這個(gè)公式并不是計(jì)算我們所要求的。
我們認(rèn)為這個(gè)公式的意思是“所有銷(xiāo)售金額的總和”指攒。但在透視表的每個(gè)單元格中慷妙,公式并不是計(jì)算所有銷(xiāo)售的總和,而是計(jì)算具有特定顏色的產(chǎn)品的銷(xiāo)售總額允悦。然而膝擂,我們從未指定計(jì)算必須在數(shù)據(jù)模型的一個(gè)子集上工作。換句話(huà)說(shuō)澡屡,這個(gè)公式并沒(méi)有指定它可以在數(shù)據(jù)子集上工作猿挚。
為什么在不同的單元格中,公式計(jì)算不同的值驶鹉?答案是非常簡(jiǎn)單的:因?yàn)樵谶@個(gè)計(jì)算上下文下绩蜻,DAX計(jì)算公式。你可以把一個(gè)公式的計(jì)算上下文想象成圍繞在單元格周?chē)梢杂?jì)算DAX公式的區(qū)域室埋。
因?yàn)楫a(chǎn)品的顏色在各行中办绝,透視表中的每一行都可以看到,在整個(gè)數(shù)據(jù)庫(kù)中姚淆,只有特定顏色的產(chǎn)品的子集孕蝉。這是公式的周?chē)鷧^(qū)域,也就是在公式計(jì)算之前應(yīng)用到數(shù)據(jù)庫(kù)的一組過(guò)濾器腌逢。當(dāng)公式計(jì)算所有銷(xiāo)售金額的總和時(shí)降淮,它不會(huì)在整個(gè)數(shù)據(jù)庫(kù)中計(jì)算它,因?yàn)樗鼰o(wú)法選擇全部行搏讶。當(dāng)DAX計(jì)算出與行值為白色的公式時(shí)佳鳖,只有白色的產(chǎn)品是可見(jiàn)的,因此媒惕,它只考慮與白色產(chǎn)品相關(guān)的銷(xiāo)售系吩。因此,當(dāng)計(jì)算僅顯示白色產(chǎn)品的透視表中的一行時(shí)妒蔚,銷(xiāo)售金額的總和就變成了所有白色產(chǎn)品的銷(xiāo)售額之和穿挨。
任何DAX公式都確定了一個(gè)計(jì)算,但是DAX在一個(gè)上下文執(zhí)行計(jì)算肴盏,它定義了計(jì)算的最終值科盛。公式雖然是一樣的,但是值是不同的因?yàn)镈AX根據(jù)不同的數(shù)據(jù)子集對(duì)它進(jìn)行計(jì)算菜皂。
現(xiàn)在讓我們把年份放在列上土涝,使透視表更有趣。現(xiàn)在的報(bào)告如圖4-3所示幌墓。
計(jì)算的規(guī)則在這一點(diǎn)上應(yīng)該是清楚的:每個(gè)單元格現(xiàn)在都有不同的值但壮,即使公式總是相同的,因?yàn)橥敢暠淼男泻土羞x擇都定義了上下文常侣。事實(shí)上蜡饵,2008年的白色產(chǎn)品銷(xiāo)售與2007年的白色產(chǎn)品銷(xiāo)售不同。而且胳施,因?yàn)槟梢栽谛泻土兄蟹胖枚鄠€(gè)字段溯祸,所以最好說(shuō)行上的字段集和列上的字段集定義上下文。圖4-4使這個(gè)更加明顯
每個(gè)單元格有不同的值舞肆,因?yàn)樵谛薪垢ā㈩伾推放泼Q(chēng)上有兩個(gè)字段。行和列完整的字段集合定義了上下文椿胯。例如筷登,圖4-4中突出顯示的單元格的上下文對(duì)應(yīng)黑色、品牌Contoso和日歷年哩盲。
注意
字段是否在行或列上(或在切片器和/或頁(yè)面過(guò)濾器上前方,或者在任何其他您可以用查詢(xún)創(chuàng)建的類(lèi)型過(guò)濾器中)并不重要。所有這些過(guò)濾器共同定義單個(gè)上下文廉油,而DAX利用這個(gè)上下文來(lái)計(jì)算公式惠险。在行或列上放置一個(gè)字段會(huì)產(chǎn)生一些美觀上的影響,但是在DAX計(jì)算值的方式上沒(méi)有任何變化抒线。
現(xiàn)在讓我們看完整的場(chǎng)景班巩。在圖4-5中,我們?cè)谇衅魃咸砑恿水a(chǎn)品類(lèi)別嘶炭,并在過(guò)濾器上添加了月份抱慌,我們選擇了12月。
在這一點(diǎn)上,很明顯宵呛,每個(gè)單元計(jì)算的值都有一個(gè)由行单匣、列、切片器和過(guò)濾器定義的上下文宝穗。所有這些過(guò)濾器共同定義一個(gè)上下文户秤,并且在公式計(jì)算之前,DAX將該上下文應(yīng)用于數(shù)據(jù)模型上逮矛。此外鸡号,重要的是要知道,并非所有的單元格都具有相同的過(guò)濾器集须鼎,不僅在值方面鲸伴,而且在字段方面也是如此府蔗。例如,列上的grand total只包含類(lèi)別汞窗、月份和年份的過(guò)濾器姓赤,但是它不包含顏色和品牌的過(guò)濾器。顏色和品牌的字段在行中仲吏,它們不會(huì)過(guò)濾總數(shù)不铆。這同樣適用于透視表中顏色的子總數(shù):對(duì)于那些單元,制造商沒(méi)有過(guò)濾器裹唆,來(lái)自行的唯一有效的過(guò)濾器是顏色
我們把這個(gè)上下文稱(chēng)為篩選上下文誓斥,正如它的名字所暗示的那樣,它是一個(gè)篩選表的上下文许帐。您所編寫(xiě)的任何公式都有不同的值劳坑,這取決于執(zhí)行計(jì)算的DAX語(yǔ)句上的篩選上下文。這種行為舞吭,雖然非常直觀泡垃,但需要被充分理解。
現(xiàn)在您已經(jīng)了解了篩選上下文是什么羡鸥,您知道下面的DAX表達(dá)式應(yīng)該被理解為“在當(dāng)前篩選上下文中可見(jiàn)的所有銷(xiāo)售金額的總和”:
[Sales Amount] := SUMX ( Sales, Sales[Quantity] * Sales[UnitPrice] )
稍后您將學(xué)習(xí)如何閱讀蔑穴、修改和清除篩選上下文。到目前為止惧浴,我們已經(jīng)足夠深入地了解了這個(gè)事實(shí)存和,即篩選上下文總是存在于透視表的任何單元格或報(bào)告/查詢(xún)中的任何值。你總是需要考慮篩選上下文來(lái)理解DAX是如何計(jì)算公式的衷旅。
理解行上下文
篩選上下文是DAX中存在的兩個(gè)上下文之一捐腿。它的搭檔是行上下文,在本節(jié)中柿顶,您將了解它是什么以及它是如何工作的茄袖。
這一次,我們使用了一個(gè)不同的公式來(lái)考慮:
Sales[GrossMargin] = Sales[SalesAmount] - Sales[TotalCost]
您可能會(huì)在一個(gè)計(jì)算列中寫(xiě)出這樣的表達(dá)式嘁锯,以便計(jì)算毛利潤(rùn)宪祥。一旦您在計(jì)算列中定義了這個(gè)公式,您就會(huì)得到結(jié)果表家乘,如圖4-6所示蝗羊。
DAX對(duì)表中所有行進(jìn)行公式計(jì)算,對(duì)于每一行仁锯,它都按照預(yù)期計(jì)算出了不同的值耀找。為了理解行上下文,我們需要有點(diǎn)學(xué)究式的閱讀公式:我們要求減去兩列业崖,但是我們從哪里告訴DAX從哪一行來(lái)得到列的值呢野芒?您可能會(huì)說(shuō)蓄愁,要使用的行是隱式的。因?yàn)樗且粋€(gè)計(jì)算列狞悲,所以DAX計(jì)算它一行一行涝登,對(duì)于每一行,它都會(huì)計(jì)算一個(gè)不同的結(jié)果效诅。這是正確的,但是趟济,從DAX表達(dá)式的角度來(lái)看乱投,要使用哪一行的信息仍然缺失。
實(shí)際上顷编,用于執(zhí)行計(jì)算的行并沒(méi)有存儲(chǔ)在公式中戚炫。它是由另一種上下文定義的:行上下文。當(dāng)你定義計(jì)算的列時(shí)媳纬,DAX從表的第一行開(kāi)始了一個(gè)迭代;它創(chuàng)建了包含該行的行上下文并對(duì)表達(dá)式求值双肤。然后它移到第二行,再次求出表達(dá)式钮惠。這發(fā)生在表格中所有的行中茅糜,如果你有100萬(wàn)行,你可以認(rèn)為DAX創(chuàng)建了100萬(wàn)行上下文來(lái)評(píng)估這個(gè)公式100萬(wàn)次素挽。顯然蔑赘,為了優(yōu)化計(jì)算,這并不是發(fā)生的事情;否則预明,DAX將是一種非常緩慢的語(yǔ)言缩赛。不管怎樣,從邏輯的角度來(lái)看撰糠,這就是它的工作原理酥馍。
讓我們?cè)囍_一點(diǎn)。行上下文是一個(gè)總是包含一行的上下文阅酪,DAX在計(jì)算列的創(chuàng)建過(guò)程中自動(dòng)定義它旨袒。您可以使用其他技術(shù)創(chuàng)建行上下文,這將在本章后面討論遮斥,但是解釋行上下文的最簡(jiǎn)單方法是查看計(jì)算過(guò)的列峦失,其中引擎總是自動(dòng)創(chuàng)建它。
總是有兩種上下文
到目前為止术吗,您已經(jīng)了解了行上下文和篩選上下文是什么尉辑,它們是DAX中僅有的上下文類(lèi)型。因此较屿,它們是修改公式結(jié)果的唯一方法隧魄。任何公式都將在這兩個(gè)不同的上下文中進(jìn)行計(jì)算:行上下文和篩選上下文卓练。我們將這兩種上下文稱(chēng)為“計(jì)算上下文”,因?yàn)樗鼈兪歉淖児接?jì)算方式的上下文购啄,為相同的公式提供不同的結(jié)果襟企。
這是一個(gè)非常重要的點(diǎn),在開(kāi)始時(shí)很難集中注意力:總是有兩個(gè)上下文狮含,一個(gè)公式的結(jié)果取決于兩者顽悼。在你的DAX學(xué)習(xí)路徑的這一點(diǎn)上,你可能會(huì)認(rèn)為這是顯而易見(jiàn)的几迄,而且是很自然的蔚龙。你也許是對(duì)的。然而映胁,在書(shū)的后面木羹,如果你不記得這兩個(gè)上下文的共存,你會(huì)發(fā)現(xiàn)一些公式是很難理解的解孙,每一個(gè)都可以改變公式的結(jié)果坑填。
測(cè)試你的計(jì)算上下文理解
在我們繼續(xù)進(jìn)行關(guān)于計(jì)算上下文的更復(fù)雜的討論之前,我們希望通過(guò)幾個(gè)示例來(lái)測(cè)試您對(duì)上下文的理解弛姜。請(qǐng)不要立即看這個(gè)解釋;在這個(gè)問(wèn)題之后停下來(lái)脐瑰,試著回答這個(gè)問(wèn)題。然后閱讀解釋?zhuān)⒃囍ダ斫馑?/p>
在計(jì)算列中使用SUM
第一個(gè)測(cè)試是非常簡(jiǎn)單的娱据。如果您在銷(xiāo)售表中定義了一個(gè)計(jì)算列蚪黑,那么會(huì)發(fā)生什么呢?
Sales[SumOfSalesAmount] = SUM ( Sales[SalesAmount] )
因?yàn)樗且粋€(gè)計(jì)算列中剩,它將被逐行計(jì)算忌穿,對(duì)于每一行,您將獲得一個(gè)結(jié)果结啼。你希望看到什么數(shù)字掠剑?從這些選項(xiàng)中選擇一個(gè):
這一行的銷(xiāo)售額的值,同時(shí)也就是每一行的不同值郊愧。
所有行的總銷(xiāo)售額朴译,也就是說(shuō),所有行的值都是一樣的属铁。
一個(gè)錯(cuò)誤;你不能在計(jì)算的列中使用求和眠寿。
請(qǐng)停止閱讀,當(dāng)我們等待你的有根據(jù)的猜測(cè)之后再繼續(xù)焦蘑。
現(xiàn)在盯拱,讓我們?cè)敿?xì)說(shuō)明當(dāng)DAX計(jì)算公式時(shí)發(fā)生了什么。您已經(jīng)了解了公式的含義:“在當(dāng)前篩選上下文中看到的所有銷(xiāo)售金額的總和〗品辏“因?yàn)樵谝粋€(gè)計(jì)算列中宁舰,DAX會(huì)逐行計(jì)算公式。因此奢浑,它為第一行創(chuàng)建一行上下文蛮艰,然后調(diào)用公式計(jì)算,并對(duì)整個(gè)表進(jìn)行迭代雀彼。這個(gè)公式計(jì)算當(dāng)前篩選上下文中所有銷(xiāo)售金額的總和壤蚜,所以真正的問(wèn)題是“當(dāng)前的篩選上下文是什么?”答案:它是完整的數(shù)據(jù)庫(kù)徊哑,因?yàn)镈AX計(jì)算這個(gè)公式在任何透視表或任何其他類(lèi)型的篩選條件之外仍律。實(shí)際上,當(dāng)沒(méi)有篩選條件激活時(shí)实柠,DAX將它作為計(jì)算列定義的一部分進(jìn)行處理。
即使有行上下文善涨,SUM也會(huì)忽略它窒盐。相反,它使用篩選上下文钢拧,現(xiàn)在的篩選上下文是完整的數(shù)據(jù)庫(kù)蟹漓。因此,第二種選擇是正確的:您將獲得總銷(xiāo)售額源内,與所有銷(xiāo)售行相同的值葡粒,如圖4-7所示。
這個(gè)例子說(shuō)明了這兩個(gè)上下文共存嗽交。他們共同在公式的結(jié)果上工作,但是用不同的方式颂斜。計(jì)算列中使用的SUM夫壁、MIN和MAX等聚合函數(shù)只使用過(guò)濾上下文,忽略行上下文沃疮,DAX只使用它來(lái)確定列值盒让。如果你選擇了第一個(gè)答案,就像許多學(xué)生通常做的那樣司蔬,這是完全正常的邑茄。關(guān)鍵是,您還沒(méi)有想到這兩個(gè)上下文正在一起工作俊啼,以不同的方式改變公式結(jié)果肺缕。當(dāng)使用直觀的邏輯時(shí),第一個(gè)答案是最常見(jiàn)的,但它是錯(cuò)誤的搓谆,現(xiàn)在你知道為什么了炒辉。
在度量值中使用列
我們想和你們做的第二個(gè)測(cè)試有點(diǎn)不同。假設(shè)你想要在一個(gè)度量中定義毛利潤(rùn)的公式泉手,而不是在一個(gè)計(jì)算的列中黔寇。你有一個(gè)帶有銷(xiāo)售金額的列,另一個(gè)用于產(chǎn)品成本的列斩萌,你可以寫(xiě)下面的表達(dá)式:
[GrossMargin] := Sales[SalesAmount] - Sales[ProductCost]
如果你試圖定義這樣一個(gè)度量值缝裤,你應(yīng)該期待什么結(jié)果?
1颊郎、這個(gè)表達(dá)式工作正常憋飞,我們需要在報(bào)告中測(cè)試結(jié)果。
2姆吭、一個(gè)錯(cuò)誤榛做,你甚至不能寫(xiě)這個(gè)公式
3。你可以定義這個(gè)公式内狸,但是當(dāng)它在透視表或查詢(xún)中使用時(shí)检眯,它會(huì)給出一個(gè)錯(cuò)誤
和以前一樣,停止閱讀昆淡,思考答案锰瘸,然后閱讀下面的解釋
在這個(gè)公式中,我們使用了Sales[SalesAmount]昂灵,這是一個(gè)列名避凝,也就是銷(xiāo)售表中銷(xiāo)售金額的值。這個(gè)定義缺少什么嗎眨补?您應(yīng)該回憶一下管削,從以前的觀點(diǎn)來(lái)看,這里缺少的信息是從哪里獲取當(dāng)前銷(xiāo)售額的值撑螺。當(dāng)您在計(jì)算列中編寫(xiě)這段代碼時(shí)佩谣,DAX知道在計(jì)算表達(dá)式時(shí)要使用的行,這要?dú)w功于行上下文实蓬。然而茸俭,這個(gè)度量值會(huì)發(fā)生什么呢?沒(méi)有迭代安皱,也沒(méi)有當(dāng)前行调鬓,也就是說(shuō),沒(méi)有行上下文酌伊。
因此腾窝,第二個(gè)答案是正確的缀踪,你甚至不能寫(xiě)公式;它在語(yǔ)法上是錯(cuò)誤的虹脯。當(dāng)你試圖輸入它的時(shí)候驴娃,你會(huì)收到一個(gè)錯(cuò)誤
記住,列本身沒(méi)有值循集。相反唇敞,它對(duì)于表格的每一行都有不同的值。因此咒彤,如果你想要一個(gè)單獨(dú)的值疆柔,你需要指定要使用的行。指定要使用的行的惟一方法是行上下文镶柱。因?yàn)樵谶@個(gè)度量中沒(méi)有行上下文旷档,公式是不正確的,從而DAX會(huì)拒絕它歇拆。
在一個(gè)度量值中指定這個(gè)計(jì)算的正確方法是使用聚合函數(shù)鞋屈,如下所列
[GrossMargin] := SUM ( Sales[SalesAmount] ) - SUM ( Sales[ProductCost] )
使用這個(gè)公式時(shí),您現(xiàn)在要求通過(guò)SUM進(jìn)行聚合故觅。因此谐区,后一個(gè)公式并不依賴(lài)于行上下文;它只需要一個(gè)篩選上下文,同時(shí)提供了正確的結(jié)果逻卖。
利用迭代器創(chuàng)造一個(gè)行上下文
您了解到DAX在定義一個(gè)計(jì)算列時(shí)自動(dòng)創(chuàng)建行上下文。在這種情況下昭抒,引擎會(huì)逐行計(jì)算DAX的表達(dá)式∑酪玻現(xiàn)在,是時(shí)候?qū)W習(xí)如何使用迭代器在DAX表達(dá)式中創(chuàng)建行上下文了
您可能還記得灭返,在第2章“引入DAX”中盗迟,所有以x結(jié)尾的函數(shù)都是迭代器,也就是說(shuō)熙含,它們遍歷表罚缕,并對(duì)每一行進(jìn)行評(píng)估,最后用不同的算法聚合結(jié)果怎静。例如邮弹,看看下面的DAX表達(dá)式:
[IncreasedSales] := SUMX ( Sales, Sales[SalesAmount] * 1.1 )
SUMX是一個(gè)迭代器,它迭代銷(xiāo)售表蚓聘,對(duì)于表的每一行腌乡,它計(jì)算銷(xiāo)售額增加10%到它的值,最后返回所有這些值的總和夜牡。為了計(jì)算每一行的表達(dá)式与纽,SUMX在Sales表上創(chuàng)建行上下文,并在迭代期間使用它。DAX在包含當(dāng)前迭代行的行上下文中計(jì)算內(nèi)部表達(dá)式(SUMX的第二個(gè)參數(shù))
需要注意的是急迂,在完整的計(jì)算流程中影所,SUMX的不同參數(shù)使用不同的上下文。讓我們更仔細(xì)地看一下相同的表達(dá)式
= SUMX (
Sales, ← 外部上下文
Sales[SalesAmount] * 1.1 ← 外部上下文 + 新的行上下文
)
第一個(gè)參數(shù)僚碎,Sales猴娩,是使用來(lái)自調(diào)用者的上下文來(lái)計(jì)算的(例如,它可能是一個(gè)透視表單元格听盖,另一個(gè)度量值胀溺,或者查詢(xún)的一部分),而第二個(gè)參數(shù)(表達(dá)式)是使用外部上下文加上新創(chuàng)建的行上下文來(lái)計(jì)算的皆看。
所有迭代器的行為都是一樣的:
1仓坞、為作為第一個(gè)參數(shù)接收的表的每一行創(chuàng)建一個(gè)新的行上下文
2、在新創(chuàng)建的行上下文中(加上在迭代開(kāi)始之前存在的任何其他上下文)腰吟,對(duì)表的每一行進(jìn)行評(píng)估无埃。
3、聚合在步驟2中計(jì)算的值毛雇。
重要的是要記住嫉称,原始上下文在表達(dá)式中仍然有效:迭代器只添加新的行上下文;它們不會(huì)以任何方式修改現(xiàn)有的。這條規(guī)則通常是有效的灵疮,但是有一個(gè)重要的例外:如果前面的上下文已經(jīng)包含了同一個(gè)表的行上下文织阅,那么新創(chuàng)建的行會(huì)上下文隱藏了先前存在的行上下文。我們將在下一節(jié)中更詳細(xì)地討論這個(gè)問(wèn)題震捣。