1.ADDCOLUMNS(<table>, <name>, <expression>[, <name>, <expression>]…)和SELECTCOLUMNS(<table>, <name>, <scalar_expression> [, <name>, <scalar_expression>]…)
函數(shù)作用:ADDCOLUMNS是將計算列添加到給定的表或表的表達(dá)式中丸升,SELECTCOLUMNS是將計算列添加到空白表中冒冬。
應(yīng)用場景:ADDCOLUMNS/SELECTCOLUMNS函數(shù)通常與其他函數(shù)結(jié)合使用,為表新添計算列攻锰。
示例:為原始銷售記錄表添加一列“AA”偶洋,使該列為每種武器的累計銷量熟吏,并存儲為一張新表。
1.1 ADDCOLUMNS
新建表:
ADD = ADDCOLUMNS('銷售記錄',"AA",CALCULATE(SUM('銷售記錄'[數(shù)量]),ALLEXCEPT('銷售記錄','銷售記錄'[武器名稱])))
對'銷售記錄'表進(jìn)行添加列操作玄窝,添加的新列名稱為“AA”牵寺,該列的含義是計算每種武器的總銷量,借助ALLEXCEPT清除[武器名稱]對結(jié)果的影響恩脂,否則結(jié)果全部相同(為所有武器名稱銷量相加的值)帽氓。
ADDCOLUMNS函數(shù)可以實現(xiàn)目標(biāo)效果,但是并不需要這么多列俩块,反而容易影響判斷黎休,那么還可以這樣操作:
新建度量值:
總銷量 = SUM('銷售記錄'[數(shù)量])
新建表:
各武器銷量 = ADDCOLUMNS(ALL('銷售記錄'[武器名稱]),"AA",[總銷量])
計算結(jié)果:
當(dāng)然,也可以使用SELECTCOLUMNS函數(shù)實現(xiàn)上述效果玉凯。
1.2 SELECTCOLUMNS
由于SELECTCOLUMNS函數(shù)是在一張空白表上添加列势腮,因此,無需添加原始銷售記錄表的所有列漫仆,假如現(xiàn)在想了解每種武器的總體銷量情況嫉鲸,通過下述操作即可實現(xiàn)。
新建表:
SELECT = DISTINCT(SELECTCOLUMNS('銷售記錄',"武器名稱",'銷售記錄'[武器名稱],"AA",CALCULATE(SUM('銷售記錄'[數(shù)量]),ALLEXCEPT('銷售記錄','銷售記錄'[武器名稱]))))
先看內(nèi)層歹啼,與ADDCOLUMNS函數(shù)類似玄渗,SELECTCOLUMNS函數(shù)也許借助ALLEXCEPT函數(shù)分別對各種武器求和座菠,不同的是,SELECTCOLUMN函數(shù)要將所需的列挑選出來藤树。
由于現(xiàn)在只有兩列浴滴,缺少了訂單編號、下單日期等的限制岁钓,計算結(jié)果會有許多重復(fù)項升略,因此還需DISTINCT函數(shù)來刪除重復(fù)項,可得到以下計算結(jié)果:
2.AVERAGE(<column>),AVERAGEA(<column>),AVERAGEX(<table>,<expression>)
當(dāng)我們遇見以X結(jié)尾的函數(shù)時屡限,應(yīng)該意識到它一般來說是一個迭代器函數(shù)品嚣,而去掉X的函數(shù),一般就是它對應(yīng)的聚合函數(shù)钧大,比如SUM()和SUMX()翰撑。迭代器函數(shù)可以對表中的多個列進(jìn)行操作,并且可以在這些列中完成逐行求值啊央,而其對應(yīng)的聚合函數(shù)眶诈,只能在單個列上運行,并且不知道列中的各個行(沒有逐行求值)瓜饥。
僅憑文字或許難以理解逝撬,以下我將詳細(xì)介紹二者的區(qū)別。
函數(shù)作用:計算平均值(算術(shù)平均值)乓土。
三者差別:
AVERAGE函數(shù)與AVERAGEA函數(shù)類似宪潮,返回列中值的平均值,區(qū)別只在于趣苏,AVERAGE函數(shù)只能處理數(shù)值坎炼,而AVERAGEA函數(shù)既可以處理數(shù)值,又可以處理文本拦键。
AVERAGEA函數(shù)處理文本時:
? ? ? 計算結(jié)果為 TRUE 的值作為 1 計數(shù);
? ? ? 計算結(jié)果為 FALSE 的值作為 0(零)計數(shù)檩淋;
? ? ? 包含非數(shù)字文本的值作為 0(零)計數(shù)芬为;
? ? ? 空文本 ("") 作為 0(零)計數(shù)。
AVERAGE函數(shù)和AVERAGEX就是一對聚合函數(shù)和迭代器函數(shù)蟀悦,區(qū)別在于AVERAGEX具有對行的感知能力媚朦,一行一行地應(yīng)用所有過濾器后完成求值。
示例:多種武器在多個銷售城市的銷售數(shù)據(jù)如下日戈,現(xiàn)欲計算各個城市的所有武器的銷售金額的平均值询张。
新建度量值:
銷售金額 = SUM('銷售記錄'[金額])
AVERAGEX = AVERAGEX(VALUES( '銷售記錄' [銷售城市]),[銷售金額])
VALUES('銷售記錄'[銷售城市])相當(dāng)于取出原始數(shù)據(jù)表中的所有銷售城市,自成一張表浙炼,并對該表中的每一行進(jìn)行求均值操作份氧。
我們再新建一個度量值:
AVERAGE = AVERAGE([金額])
不知你是否已經(jīng)猜想到了它們的結(jié)果分別是什么唯袄。
結(jié)果如下:
對于AVERAGEX函數(shù),費城/洛杉磯/紐約/芝加哥的均值為各自的銷售金額除以1蜗帜,而總計行的均值為總銷售金額546/銷售城市總數(shù)量4=136.5.
對于AVERAGE函數(shù)恋拷,無法逐行求值,它所能做的就是在應(yīng)用過濾器之后將所有內(nèi)容添加到它所呈現(xiàn)的單列中厅缺。以費城為例蔬顾,費城就是它的過濾器,先篩選出費城的總銷售金額156湘捎,然后除以費城占據(jù)的行數(shù)7行诀豁,結(jié)果為22.29。
很顯然窥妇,該場景下舷胜,我們應(yīng)該使用AVERAGEX函數(shù)。
補(bǔ)充:實現(xiàn)上述功能秩伞,采取AVERAGEX函數(shù)的確是最簡單最方便的方法逞带,但是之前介紹過的篩選器函數(shù)SELECTEDVALUE、HASONEVALUE纱新、HASONEFILTER也是解決此問題的辦法之一展氓,不妨一試。
新建度量值:
SELECTEDVALUE = IF(SELECTEDVALUE( '銷售記錄' [銷售城市])=BLANK(),DIVIDE([銷售金額],DISTINCTCOUNT([銷售城市])),[銷售金額])
HANSONEVALUE0 = IF(HASONEVALUE('銷售記錄'[銷售城市]),[銷售金額],DIVIDE([銷售金額],DISTINCTCOUNT([銷售城市])))
HANSONEFILTER = IF(HASONEFILTER('銷售記錄'[銷售城市]),[銷售金額],DIVIDE([銷售金額],DISTINCTCOUNT([銷售城市])))
以上三種方式都可以得到正確的計算結(jié)果脸爱。