概述 SUM()是一個(gè)聚合函數(shù)。在應(yīng)用將影響公式的所有過濾器后,它會(huì)將您指定的單個(gè)列中的所有值相加。SUM()不知道行的存在(它不能逐行求值) - 它所能做的就是在應(yīng)用過濾器之后將所有內(nèi)容添加到它所呈現(xiàn)的單列中。 SUMX()是一個(gè)迭代器函數(shù)。它應(yīng)用于一個(gè)表,一行一行地應(yīng)用所有過濾器后完成求值。 SUMX()具有表中行的感知,因此可以引用每行與表中任何列的交集。SUMX()可以在單個(gè)列上運(yùn)行,但也可以在多個(gè)列上運(yùn)行 - 因?yàn)樗哂兄鹦泄ぷ鞯哪芰Α?/p> 綜上所述 ·SUM()在單個(gè)列上運(yùn)行,并且不知道列中的各個(gè)行(沒有逐行求值)。 ·SUMX()可以對(duì)表中的多個(gè)列進(jìn)行操作,并且可以在這些列中完成逐行求值。 這兩個(gè)功能可以最終給你同樣的結(jié)果(也許是,也許不是)。它們通常在矩陣給出相同的結(jié)果,但通常在視覺的子總數(shù)和總計(jì)部分中給出不同的結(jié)果。 SUM()函數(shù) 語(yǔ)法:= SUM(<列名>) 示例:總銷售額= SUM(銷售表[銷售額]) SUM()函數(shù)在單個(gè)數(shù)據(jù)列上運(yùn)行,以聚合該單個(gè)列中的所有數(shù)據(jù)并應(yīng)用當(dāng)前過濾器 - 首先過濾,然后評(píng)估第二個(gè)。 SUMX()函數(shù) 語(yǔ)法:= SUMX(<Table>,<expression>) 示例:總銷售額SUMX = SUMX(銷售表,銷售表[數(shù)量] *銷售表[單位價(jià)格]) SUMX()將迭代第一個(gè)參數(shù)中指定的表,一次一行,并完成第二個(gè)參數(shù)中指定的計(jì)算,例如數(shù)量x單位價(jià)格,如上例所示,當(dāng)前過濾器已應(yīng)用(即仍然首先過濾,求值第二)。一旦它對(duì)指定表中的每一行(在應(yīng)用當(dāng)前過濾器之后)完成此操作,它就會(huì)累計(jì)所有逐行計(jì)算的總和以獲得總計(jì)。結(jié)果返回此總數(shù)。 那么我應(yīng)該使用哪一個(gè)呢? 您使用哪種方式取決于您的個(gè)人偏好和數(shù)據(jù)結(jié)構(gòu)。我們來看幾個(gè)例子。 1數(shù)量和每單位價(jià)格 2延期金額 3總計(jì)不要加起來 1.數(shù)量和價(jià)格 如果您的銷售表包含數(shù)量列和“單價(jià)”的另一列(如上所示),那么您必須將“數(shù)量”乘以“單價(jià)”以便獲得總銷售額。將總量SUM(數(shù)量)加起來并將其乘以平均單價(jià)是不合適的,因?yàn)檫@將給出錯(cuò)誤的答案。 如果您的數(shù)據(jù)以這種方式構(gòu)建(如上圖所示),那么您只需要使用SUMX() - 這就是迭代器函數(shù)的設(shè)計(jì)目的。這是公式的樣子。 總銷售額1 = SUMX(銷售表,銷售表[數(shù)量] *銷售表[單價(jià)]) 2.延期金額 如果您的數(shù)據(jù)包含具有該行項(xiàng)目的擴(kuò)展總銷售額的單個(gè)列(即,它沒有每單位的數(shù)量和價(jià)格),則可以使用 SUM()來累加值。
總銷售額2 = SUM(銷售表[銷售額]) 在此示例中不需要迭代器,因?yàn)樵谶@種情況下,它只是跨單個(gè)列的簡(jiǎn)單計(jì)算,并且不需要逐行執(zhí)行。但請(qǐng)注意,你仍然可以使用SUMX()(如下所示),它會(huì)給你相同的答案。 總銷售額2替代= SUMX(銷售表,銷售表[銷售額]) 并且使用SUMX()的替代公式在性能和效率上與SUM()是相同的. 3.總計(jì)不要加起來 當(dāng)你必須使用不那么明顯的SUMX()時(shí),還有另一個(gè)用例。當(dāng)您遇到總計(jì)不按需要/期望加起來的問題時(shí),您將需要使用像SUMX這樣的迭代器來糾正問題。我已經(jīng)創(chuàng)建了一個(gè)小樣本數(shù)據(jù)表來解釋。
上表顯示了4位客戶,他們每次購(gòu)物時(shí)平均花費(fèi)的金額以及他們購(gòu)物的次數(shù)。如果我將這些數(shù)據(jù)加載到Power BI中,然后嘗試使用聚合器函數(shù)來查找所有客戶的平均支出以及花費(fèi)的總金額,我會(huì)在總行中得到錯(cuò)誤的答案(如下所示)。
以下是上述措施: 總訪問次數(shù)= SUM(購(gòu)物表[訪問次數(shù)]) - 該公式的總數(shù)是正確的。 每次訪問平均花費(fèi)=AVERAGE(購(gòu)物表 [每次訪問花費(fèi)]) - 這里的總數(shù)是錯(cuò)誤的。 總支出= [每次訪問費(fèi)用] * [訪問總次數(shù)] - 這里的總數(shù)也是錯(cuò)誤的。 第一個(gè)度量[訪問總數(shù)]是正確的,因?yàn)閿?shù)據(jù)是加性的,但其他2個(gè)度量給出了錯(cuò)誤的結(jié)果。這是一個(gè)典型的情況,你無法在總體水平上對(duì)平均值進(jìn)行乘法運(yùn)算。鑒于我開始使用的樣本數(shù)據(jù),計(jì)算正確答案的唯一方法是為表中的每個(gè)客戶完成逐行評(píng)估,如下所示。
在上面的第二個(gè)表中,我編寫了一個(gè)SUMX()來首先創(chuàng)建Total Spent SUMX(逐行)。只有這樣我才能計(jì)算每次訪問的平均花費(fèi)作為最終公式。 總訪問次數(shù)= SUM(購(gòu)物表[訪問次數(shù)]) 總花費(fèi)= SUMX(購(gòu)物表,購(gòu)物表 [每次訪問花費(fèi)] *購(gòu)物表[訪問次數(shù)]) 每次訪問平均花費(fèi)= DIVIDE([總花費(fèi)SUMX], [總訪問量]) 在第二種情況下,SUMX正在一次一行地處理數(shù)據(jù)表并正確計(jì)算結(jié)果,即使對(duì)于表底部的總行也是如此。 性能影響存儲(chǔ)引擎 我要談的最后一件事是使用SUM與SUMX的性能影響。鑒于SUMX是一個(gè)迭代器,您可能認(rèn)為SUMX本質(zhì)上是低效的。一般來說,這不是真的,因?yàn)檐浖呀?jīng)過優(yōu)化以有效地處理場(chǎng)景。話雖如此,糟糕的DAX肯定會(huì)導(dǎo)致SUMX效率低下。 Power Pivot有2個(gè)計(jì)算引擎,存儲(chǔ)引擎(SE)和公式引擎(FE)。SE更快,多線程和緩存。FE速度較慢,單線程且未緩存。這本身就是一個(gè)復(fù)雜的主題,我將只討論表面,但其含義是您應(yīng)該編寫公式以盡可能利用SE。當(dāng)然,如果您不確切知道如何做到這一點(diǎn),這可能很難,但有一些簡(jiǎn)單的提示可以幫助您。 1.SUM()總是使用SE進(jìn)行計(jì)算,因此無需擔(dān)心。 2.對(duì)于大多數(shù)簡(jiǎn)單的計(jì)算(如Sales [數(shù)量] *銷售[單位價(jià)格]),SUMX()也將使用SE,所以那里都很好。 3.在某些情況下,SUMX()可以使用FE執(zhí)行部分或全部計(jì)算,特別是如果公式中有復(fù)雜的比較語(yǔ)句。如果SUMX需要使用FE,那么性能可能會(huì)很慢 - 有時(shí)非常慢。 關(guān)于第3點(diǎn),最好建議是避免在SUMX函數(shù)中編寫復(fù)雜的條件語(yǔ)句,如“IF語(yǔ)句”。考慮以下兩個(gè)公式: 物品總銷售額超過100美元 = SUMX(銷售, IF(銷售[ExtendedAmount]> 100,銷售[ExtendedAmount]) ) 物品總銷售額超過100美元 =CALCULATE ( SUMX(銷售,銷售[ExtendedAmount]), 銷售[ExtendedAmount]> 100 ) 第一個(gè)公式(Bad)在SUMX中有一個(gè)IF語(yǔ)句。此IF語(yǔ)句強(qiáng)制存儲(chǔ)引擎將求值任務(wù)傳遞給公式引擎以進(jìn)行比較檢查,以確定每個(gè)單獨(dú)的行是否大于100,然后再?zèng)Q定是否將其包括在計(jì)算中。因此,公式引擎必須一次完成一行任務(wù),使評(píng)估變得緩慢且低效。 第二個(gè)公式(Good)首先使用CALCULATE()修改來自visual的初始過濾器,以在Sales [ExtendedAmount]> 100上添加額外的過濾器。這個(gè)新過濾器由存儲(chǔ)引擎非常有效地應(yīng)用。在CALCULATE()修改過濾器之后,SUMX()可以完成其工作,即使用存儲(chǔ)引擎(而不是公式引擎)應(yīng)用新的過濾器集合來添加剩余的行。結(jié)果,這第二個(gè)公式非常有效。在我完成的一些簡(jiǎn)單測(cè)試中,第一個(gè)(壞)公式比第二個(gè)(好)公式慢了5倍。在其他情況下,它可能會(huì)慢100或甚至1000倍,所以這顯然可能是一個(gè)問題。 壓縮對(duì)性能的影響 可影響性能的第二個(gè)領(lǐng)域是整體數(shù)據(jù)模型壓縮。數(shù)據(jù)模型中的列中存在的唯一值越多,數(shù)據(jù)的壓縮程度就越低。數(shù)據(jù)壓縮得越少,所需的內(nèi)存就越多,計(jì)算速度就越慢。讓我們?cè)倏匆幌卤疚那懊娴谋砀瘛?/p> 示例表1
示例表1[Total Sales]數(shù)據(jù)列具有所有唯一值。此列不能很好地壓縮。 示例表2 在此表中,Qty列中還有重復(fù)值,還有每單位價(jià)格列。列中的唯一值越少,壓縮越好。 當(dāng)然,這兩個(gè)樣本表當(dāng)然非常小,但想象一下這個(gè)概念對(duì)非常大的表(例如具有數(shù)百萬行數(shù)據(jù)的表)的影響。對(duì)于非常大的表,示例表1中的唯一值的數(shù)量可能遠(yuǎn)遠(yuǎn)大于示例表2中的列中的唯一值的數(shù)量。因此,如示例2中所述的加載數(shù)據(jù)可能具有對(duì)總表大小產(chǎn)生積極影響,從而影響數(shù)據(jù)模型的性能。做出改變當(dāng)然可能意味著你必須交換你的措施: SUM(銷售[總銷售額]) 至 SUMX(銷售,銷售[數(shù)量] *銷售[單位價(jià)格]) SUMX比起SUM的這種用法非常精細(xì)并且有更高的性能。 |
|